|
90182
|
2451
|
23
|
2026-04-27T17:25:57.533946+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-27/1777 /Users/lukas/.screenpipe/data/data/2026-04-27/1777310757533_m1.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests","depth":4,"value":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests","is_focused":true},{"role":"AXTextField","text":"retention","depth":3,"bounds":{"left":0.7888889,"top":0.10555556,"width":0.13055556,"height":0.024444444},"automation_id":"_NS:65","value":"retention","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.7902778,"top":0.10555556,"width":0.017361112,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.9013889,"top":0.10555556,"width":0.015277778,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.925,"top":0.10666667,"width":0.014583333,"height":0.023333333},"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.93958336,"top":0.10666667,"width":0.014583333,"height":0.023333333},"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-95-134:~ (tail)","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.47083333,"top":0.033333335,"width":0.058333334,"height":0.017777778},"role_description":"text"}]...
|
-3596382804963053315
|
7216369437532337521
|
click
|
accessibility
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
NULL
|
NULL
|
|
90189
|
2453
|
1
|
2026-04-27T17:27:22.784829+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-27/1777 /Users/lukas/.screenpipe/data/data/2026-04-27/1777310842784_m1.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)","depth":4,"value":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)","is_focused":true},{"role":"AXTextField","text":"retention","depth":3,"bounds":{"left":0.7888889,"top":0.10555556,"width":0.13055556,"height":0.024444444},"automation_id":"_NS:65","value":"retention","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.7902778,"top":0.10555556,"width":0.017361112,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.9013889,"top":0.10555556,"width":0.015277778,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.925,"top":0.10666667,"width":0.014583333,"height":0.023333333},"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.93958336,"top":0.10666667,"width":0.014583333,"height":0.023333333},"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-95-134:~ (tail)","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.47083333,"top":0.033333335,"width":0.058333334,"height":0.017777778},"role_description":"text"}]...
|
-3596382804963053315
|
7216369437532337521
|
click
|
accessibility
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
90186
|
NULL
|
|
90190
|
2455
|
1
|
2026-04-27T17:27:22.873451+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-27/1777 /Users/lukas/.screenpipe/data/data/2026-04-27/1777310842873_m2.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)","depth":4,"value":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)","is_focused":true},{"role":"AXTextField","text":"retention","depth":3,"bounds":{"left":0.64793885,"top":1.0,"width":0.0625,"height":-0.07581806},"automation_id":"_NS:65","value":"retention","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.64860374,"top":1.0,"width":0.00831117,"height":-0.07581806},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.7017952,"top":1.0,"width":0.00731383,"height":-0.07581806},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.7130984,"top":1.0,"width":0.006981383,"height":-0.07661617},"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.7200798,"top":1.0,"width":0.006981383,"height":-0.07661617},"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.3487367,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.35073137,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.42719415,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42918882,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.58410907,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.58610374,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-95-134:~ (tail)","depth":2,"bounds":{"left":0.6625665,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.66456115,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.4956782,"top":1.0,"width":0.027925532,"height":-0.02394259},"role_description":"text"}]...
|
-3596382804963053315
|
7216369437532337521
|
click
|
accessibility
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
90185
|
NULL
|
|
90191
|
2455
|
2
|
2026-04-27T17:27:41.883554+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-27/1777 /Users/lukas/.screenpipe/data/data/2026-04-27/1777310861883_m2.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:27:23.708271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:27:23.857140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:27:24.535232Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:27:24.536622Z INFO screenpipe: stopping UI event capture\n\n2026-04-27T20:27:24.536751Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:27:24.536810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:27:24.536876Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:27:24.537910Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager \n2026-04-27T20:27:24.537937Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:27:24.538217Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:27:24.538354Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:27:24.550217Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:27:24.665575Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:27:24.665646Z INFO screenpipe: shutdown complete\nnpx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:27:40.109271Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:27:40.171419Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T20:27:40.783105Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:27:40.784956Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:27:40.785423Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:27:40.825160Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:27:40.825230Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:27:40.825425Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:27:40.825522Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:27:40.825535Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:27:40.825448Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:27:40.825589Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:27:40.839746Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:27:40.846623Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:27:40.846844Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:27:40.847335Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:27:40.847511Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:27:40.847677Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:27:40.848142Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:27:40.848156Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n2026-04-27T20:27:40.848964Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T20:27:40.852124Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:27:40.862411Z INFO screenpipe: starting UI event capture\n2026-04-27T20:27:40.878161Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:27:40.894556Z INFO screenpipe_engine::ui_recorder: UI recording session started: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:27:40.894598Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:27:40.894637Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:27:40.894634 UTC to 2026-04-27 17:27:40.894634 UTC)\n2026-04-27T20:27:40.895369Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:27:40.902580Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:27:40.910282Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:27:41.214017Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:27:41.214052Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.214116Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.381988Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:27:41.382022Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:27:41.382038Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:27:41.382045Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:27:41.382086Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:27:42.095403Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:27:42.253405Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)","depth":4,"value":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:27:23.708271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:27:23.857140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:27:24.535232Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:27:24.536622Z INFO screenpipe: stopping UI event capture\n\n2026-04-27T20:27:24.536751Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:27:24.536810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:27:24.536876Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:27:24.537910Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager \n2026-04-27T20:27:24.537937Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:27:24.538217Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:27:24.538354Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:27:24.550217Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:27:24.665575Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:27:24.665646Z INFO screenpipe: shutdown complete\nnpx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:27:40.109271Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:27:40.171419Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T20:27:40.783105Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:27:40.784956Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:27:40.785423Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:27:40.825160Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:27:40.825230Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:27:40.825425Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:27:40.825522Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:27:40.825535Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:27:40.825448Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:27:40.825589Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:27:40.839746Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:27:40.846623Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:27:40.846844Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:27:40.847335Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:27:40.847511Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:27:40.847677Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:27:40.848142Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:27:40.848156Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n2026-04-27T20:27:40.848964Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T20:27:40.852124Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:27:40.862411Z INFO screenpipe: starting UI event capture\n2026-04-27T20:27:40.878161Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:27:40.894556Z INFO screenpipe_engine::ui_recorder: UI recording session started: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:27:40.894598Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:27:40.894637Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:27:40.894634 UTC to 2026-04-27 17:27:40.894634 UTC)\n2026-04-27T20:27:40.895369Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:27:40.902580Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:27:40.910282Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:27:41.214017Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:27:41.214052Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.214116Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.381988Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:27:41.382022Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:27:41.382038Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:27:41.382045Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:27:41.382086Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:27:42.095403Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:27:42.253405Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)","is_focused":true},{"role":"AXTextField","text":"retention","depth":3,"bounds":{"left":0.64793885,"top":1.0,"width":0.0625,"height":-0.07581806},"automation_id":"_NS:65","value":"retention","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.64860374,"top":1.0,"width":0.00831117,"height":-0.07581806},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.7017952,"top":1.0,"width":0.00731383,"height":-0.07581806},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.7130984,"top":1.0,"width":0.006981383,"height":-0.07661617},"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.7200798,"top":1.0,"width":0.006981383,"height":-0.07661617},"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.3487367,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.35073137,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.42719415,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42918882,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.58410907,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.58610374,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-95-134:~ (tail)","depth":2,"bounds":{"left":0.6625665,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.66456115,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.4956782,"top":1.0,"width":0.027925532,"height":-0.02394259},"role_description":"text"}]...
|
-3596382804963053315
|
7216369437532337521
|
manual
|
accessibility
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
NULL
|
NULL
|
|
90192
|
2453
|
2
|
2026-04-27T17:27:41.716610+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-27/1777 /Users/lukas/.screenpipe/data/data/2026-04-27/1777310861716_m1.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:27:23.708271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:27:23.857140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:27:24.535232Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:27:24.536622Z INFO screenpipe: stopping UI event capture\n\n2026-04-27T20:27:24.536751Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:27:24.536810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:27:24.536876Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:27:24.537910Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager \n2026-04-27T20:27:24.537937Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:27:24.538217Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:27:24.538354Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:27:24.550217Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:27:24.665575Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:27:24.665646Z INFO screenpipe: shutdown complete\nnpx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:27:40.109271Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:27:40.171419Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T20:27:40.783105Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:27:40.784956Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:27:40.785423Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:27:40.825160Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:27:40.825230Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:27:40.825425Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:27:40.825522Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:27:40.825535Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:27:40.825448Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:27:40.825589Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:27:40.839746Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:27:40.846623Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:27:40.846844Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:27:40.847335Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:27:40.847511Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:27:40.847677Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:27:40.848142Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:27:40.848156Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n2026-04-27T20:27:40.848964Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T20:27:40.852124Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:27:40.862411Z INFO screenpipe: starting UI event capture\n2026-04-27T20:27:40.878161Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:27:40.894556Z INFO screenpipe_engine::ui_recorder: UI recording session started: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:27:40.894598Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:27:40.894637Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:27:40.894634 UTC to 2026-04-27 17:27:40.894634 UTC)\n2026-04-27T20:27:40.895369Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:27:40.902580Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:27:40.910282Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:27:41.214017Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:27:41.214052Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.214116Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.381988Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:27:41.382022Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:27:41.382038Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:27:41.382045Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:27:41.382086Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:27:42.095403Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:27:42.253405Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:42.462118Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90191, dur=129ms\n2026-04-27T20:27:42.463860Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2","depth":4,"value":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:27:23.708271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:27:23.857140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:27:24.535232Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:27:24.536622Z INFO screenpipe: stopping UI event capture\n\n2026-04-27T20:27:24.536751Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:27:24.536810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:27:24.536876Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:27:24.537910Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager \n2026-04-27T20:27:24.537937Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:27:24.538217Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:27:24.538354Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:27:24.550217Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:27:24.665575Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:27:24.665646Z INFO screenpipe: shutdown complete\nnpx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:27:40.109271Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:27:40.171419Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T20:27:40.783105Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:27:40.784956Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:27:40.785423Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:27:40.825160Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:27:40.825230Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:27:40.825425Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:27:40.825522Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:27:40.825535Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:27:40.825448Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:27:40.825589Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:27:40.839746Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:27:40.846623Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:27:40.846844Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:27:40.847335Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:27:40.847511Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:27:40.847677Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:27:40.848142Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:27:40.848156Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n2026-04-27T20:27:40.848964Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T20:27:40.852124Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:27:40.862411Z INFO screenpipe: starting UI event capture\n2026-04-27T20:27:40.878161Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:27:40.894556Z INFO screenpipe_engine::ui_recorder: UI recording session started: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:27:40.894598Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:27:40.894637Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:27:40.894634 UTC to 2026-04-27 17:27:40.894634 UTC)\n2026-04-27T20:27:40.895369Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:27:40.902580Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:27:40.910282Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:27:41.214017Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:27:41.214052Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.214116Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.381988Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:27:41.382022Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:27:41.382038Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:27:41.382045Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:27:41.382086Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:27:42.095403Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:27:42.253405Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:42.462118Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90191, dur=129ms\n2026-04-27T20:27:42.463860Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2","is_focused":true},{"role":"AXTextField","text":"retention","depth":3,"bounds":{"left":0.7888889,"top":0.10555556,"width":0.13055556,"height":0.024444444},"automation_id":"_NS:65","value":"retention","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.7902778,"top":0.10555556,"width":0.017361112,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.9013889,"top":0.10555556,"width":0.015277778,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.925,"top":0.10666667,"width":0.014583333,"height":0.023333333},"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.93958336,"top":0.10666667,"width":0.014583333,"height":0.023333333},"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-95-134:~ (tail)","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.47083333,"top":0.033333335,"width":0.058333334,"height":0.017777778},"role_description":"text"}]...
|
-3596382804963053315
|
7216369437532337521
|
manual
|
accessibility
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
NULL
|
NULL
|
|
90240
|
2453
|
21
|
2026-04-27T17:30:30.668184+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-27/1777 /Users/lukas/.screenpipe/data/data/2026-04-27/1777311030668_m1.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:27:23.708271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:27:23.857140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:27:24.535232Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:27:24.536622Z INFO screenpipe: stopping UI event capture\n\n2026-04-27T20:27:24.536751Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:27:24.536810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:27:24.536876Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:27:24.537910Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager \n2026-04-27T20:27:24.537937Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:27:24.538217Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:27:24.538354Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:27:24.550217Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:27:24.665575Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:27:24.665646Z INFO screenpipe: shutdown complete\nnpx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:27:40.109271Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:27:40.171419Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T20:27:40.783105Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:27:40.784956Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:27:40.785423Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:27:40.825160Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:27:40.825230Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:27:40.825425Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:27:40.825522Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:27:40.825535Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:27:40.825448Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:27:40.825589Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:27:40.839746Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:27:40.846623Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:27:40.846844Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:27:40.847335Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:27:40.847511Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:27:40.847677Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:27:40.848142Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:27:40.848156Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n2026-04-27T20:27:40.848964Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T20:27:40.852124Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:27:40.862411Z INFO screenpipe: starting UI event capture\n2026-04-27T20:27:40.878161Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:27:40.894556Z INFO screenpipe_engine::ui_recorder: UI recording session started: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:27:40.894598Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:27:40.894637Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:27:40.894634 UTC to 2026-04-27 17:27:40.894634 UTC)\n2026-04-27T20:27:40.895369Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:27:40.902580Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:27:40.910282Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:27:41.214017Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:27:41.214052Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.214116Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.381988Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:27:41.382022Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:27:41.382038Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:27:41.382045Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:27:41.382086Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:27:42.095403Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:27:42.253405Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:42.462118Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90191, dur=129ms\n2026-04-27T20:27:42.463860Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T20:27:42.693627Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90192, dur=77ms\n2026-04-27T20:27:51.381510Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:51.712562Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7532 elapsed=10.816977375s\n2026-04-27T20:27:51.737118Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7531 frame entries, coverage from 2026-04-26 17:27:40.894634 UTC\n2026-04-27T20:27:56.962882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:28:49.821781Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=51 elapsed=8.990252667s\n2026-04-27T20:28:49.821906Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 51 eligible frames\n2026-04-27T20:28:51.481884Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 8.0MB → 0.5MB (14.8x), 24 JPEGs deleted\n2026-04-27T20:28:53.051453Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.7MB → 0.3MB (18.4x), 25 JPEGs deleted","depth":4,"value":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:27:23.708271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:27:23.857140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:27:24.535232Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:27:24.536622Z INFO screenpipe: stopping UI event capture\n\n2026-04-27T20:27:24.536751Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:27:24.536810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:27:24.536876Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:27:24.537910Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager \n2026-04-27T20:27:24.537937Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:27:24.538217Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:27:24.538354Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:27:24.550217Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:27:24.665575Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:27:24.665646Z INFO screenpipe: shutdown complete\nnpx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:27:40.109271Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:27:40.171419Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T20:27:40.783105Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:27:40.784956Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:27:40.785423Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:27:40.825160Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:27:40.825230Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:27:40.825425Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:27:40.825522Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:27:40.825535Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:27:40.825448Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:27:40.825589Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:27:40.839746Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:27:40.846623Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:27:40.846844Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:27:40.847335Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:27:40.847511Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:27:40.847677Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:27:40.848142Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:27:40.848156Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n2026-04-27T20:27:40.848964Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T20:27:40.852124Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:27:40.862411Z INFO screenpipe: starting UI event capture\n2026-04-27T20:27:40.878161Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:27:40.894556Z INFO screenpipe_engine::ui_recorder: UI recording session started: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:27:40.894598Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:27:40.894637Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:27:40.894634 UTC to 2026-04-27 17:27:40.894634 UTC)\n2026-04-27T20:27:40.895369Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:27:40.902580Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:27:40.910282Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:27:41.214017Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:27:41.214052Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.214116Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.381988Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:27:41.382022Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:27:41.382038Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:27:41.382045Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:27:41.382086Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:27:42.095403Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:27:42.253405Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:42.462118Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90191, dur=129ms\n2026-04-27T20:27:42.463860Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T20:27:42.693627Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90192, dur=77ms\n2026-04-27T20:27:51.381510Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:51.712562Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7532 elapsed=10.816977375s\n2026-04-27T20:27:51.737118Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7531 frame entries, coverage from 2026-04-26 17:27:40.894634 UTC\n2026-04-27T20:27:56.962882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:28:49.821781Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=51 elapsed=8.990252667s\n2026-04-27T20:28:49.821906Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 51 eligible frames\n2026-04-27T20:28:51.481884Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 8.0MB → 0.5MB (14.8x), 24 JPEGs deleted\n2026-04-27T20:28:53.051453Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.7MB → 0.3MB (18.4x), 25 JPEGs deleted","is_focused":true},{"role":"AXTextField","text":"retention","depth":3,"bounds":{"left":0.7888889,"top":0.10555556,"width":0.13055556,"height":0.024444444},"automation_id":"_NS:65","value":"retention","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.7902778,"top":0.10555556,"width":0.017361112,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.9013889,"top":0.10555556,"width":0.015277778,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.925,"top":0.10666667,"width":0.014583333,"height":0.023333333},"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.93958336,"top":0.10666667,"width":0.014583333,"height":0.023333333},"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-95-134:~ (tail)","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.47083333,"top":0.033333335,"width":0.058333334,"height":0.017777778},"role_description":"text"}]...
|
-3596382804963053315
|
7216369437532337521
|
click
|
accessibility
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
NULL
|
NULL
|
|
90241
|
2453
|
22
|
2026-04-27T17:30:56.239223+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-27/1777 /Users/lukas/.screenpipe/data/data/2026-04-27/1777311056239_m1.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:27:23.708271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:27:23.857140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:27:24.535232Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:27:24.536622Z INFO screenpipe: stopping UI event capture\n\n2026-04-27T20:27:24.536751Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:27:24.536810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:27:24.536876Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:27:24.537910Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager \n2026-04-27T20:27:24.537937Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:27:24.538217Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:27:24.538354Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:27:24.550217Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:27:24.665575Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:27:24.665646Z INFO screenpipe: shutdown complete\nnpx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:27:40.109271Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:27:40.171419Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T20:27:40.783105Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:27:40.784956Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:27:40.785423Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:27:40.825160Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:27:40.825230Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:27:40.825425Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:27:40.825522Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:27:40.825535Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:27:40.825448Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:27:40.825589Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:27:40.839746Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:27:40.846623Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:27:40.846844Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:27:40.847335Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:27:40.847511Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:27:40.847677Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:27:40.848142Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:27:40.848156Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n2026-04-27T20:27:40.848964Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T20:27:40.852124Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:27:40.862411Z INFO screenpipe: starting UI event capture\n2026-04-27T20:27:40.878161Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:27:40.894556Z INFO screenpipe_engine::ui_recorder: UI recording session started: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:27:40.894598Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:27:40.894637Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:27:40.894634 UTC to 2026-04-27 17:27:40.894634 UTC)\n2026-04-27T20:27:40.895369Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:27:40.902580Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:27:40.910282Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:27:41.214017Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:27:41.214052Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.214116Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.381988Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:27:41.382022Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:27:41.382038Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:27:41.382045Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:27:41.382086Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:27:42.095403Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:27:42.253405Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:42.462118Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90191, dur=129ms\n2026-04-27T20:27:42.463860Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T20:27:42.693627Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90192, dur=77ms\n2026-04-27T20:27:51.381510Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:51.712562Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7532 elapsed=10.816977375s\n2026-04-27T20:27:51.737118Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7531 frame entries, coverage from 2026-04-26 17:27:40.894634 UTC\n2026-04-27T20:27:56.962882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:28:49.821781Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=51 elapsed=8.990252667s\n2026-04-27T20:28:49.821906Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 51 eligible frames\n2026-04-27T20:28:51.481884Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 8.0MB → 0.5MB (14.8x), 24 JPEGs deleted\n2026-04-27T20:28:53.051453Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.7MB → 0.3MB (18.4x), 25 JPEGs deleted\n^C2026-04-27T20:30:32.129537Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:30:32.130931Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:30:32.131010Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:30:32.131074Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:30:32.131039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:30:32.131133Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:30:32.131085Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:30:32.131290Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:30:32.131334Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:30:32.138634Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:30:32.286550Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:30:32.287619Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:30:54.735165Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:30:54.797709Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:30:55.472614Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:30:55.475859Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:30:55.475892Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:30:55.476036Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:30:55.476044Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:30:55.476057Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:30:55.476105Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:30:55.476106Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:30:55.476655Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:30:55.478599Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:30:55.478870Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:30:55.479291Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:30:55.479475Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:30:55.479705Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:30:55.480173Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:30:55.480195Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:30:55.482746Z INFO screenpipe: starting UI event capture\n2026-04-27T20:30:55.482271Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T20:30:55.489318Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:30:55.490977Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:30:55.499721Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:30:55.515391Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:30:55.515493Z INFO screenpipe_engine::ui_recorder: UI recording session started: c94c9344-e31e-4db3-a794-faa7352ffc62\n2026-04-27T20:30:55.515697Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:30:55.515694 UTC to 2026-04-27 17:30:55.515694 UTC)\n2026-04-27T20:30:55.516149Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:30:55.524148Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:30:55.530896Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:30:55.737812Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:30:55.737864Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.737908Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.869687Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:30:55.869717Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:30:55.869731Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:30:55.869750Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)","depth":4,"value":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:27:23.708271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:27:23.857140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:27:24.535232Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:27:24.536622Z INFO screenpipe: stopping UI event capture\n\n2026-04-27T20:27:24.536751Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:27:24.536810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:27:24.536876Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:27:24.537910Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager \n2026-04-27T20:27:24.537937Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:27:24.538217Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:27:24.538354Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:27:24.550217Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:27:24.665575Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:27:24.665646Z INFO screenpipe: shutdown complete\nnpx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:27:40.109271Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:27:40.171419Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T20:27:40.783105Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:27:40.784956Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:27:40.785423Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:27:40.825160Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:27:40.825230Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:27:40.825425Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:27:40.825522Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:27:40.825535Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:27:40.825448Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:27:40.825589Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:27:40.839746Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:27:40.846623Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:27:40.846844Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:27:40.847335Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:27:40.847511Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:27:40.847677Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:27:40.848142Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:27:40.848156Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n2026-04-27T20:27:40.848964Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T20:27:40.852124Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:27:40.862411Z INFO screenpipe: starting UI event capture\n2026-04-27T20:27:40.878161Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:27:40.894556Z INFO screenpipe_engine::ui_recorder: UI recording session started: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:27:40.894598Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:27:40.894637Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:27:40.894634 UTC to 2026-04-27 17:27:40.894634 UTC)\n2026-04-27T20:27:40.895369Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:27:40.902580Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:27:40.910282Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:27:41.214017Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:27:41.214052Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.214116Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.381988Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:27:41.382022Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:27:41.382038Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:27:41.382045Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:27:41.382086Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:27:42.095403Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:27:42.253405Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:42.462118Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90191, dur=129ms\n2026-04-27T20:27:42.463860Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T20:27:42.693627Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90192, dur=77ms\n2026-04-27T20:27:51.381510Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:51.712562Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7532 elapsed=10.816977375s\n2026-04-27T20:27:51.737118Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7531 frame entries, coverage from 2026-04-26 17:27:40.894634 UTC\n2026-04-27T20:27:56.962882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:28:49.821781Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=51 elapsed=8.990252667s\n2026-04-27T20:28:49.821906Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 51 eligible frames\n2026-04-27T20:28:51.481884Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 8.0MB → 0.5MB (14.8x), 24 JPEGs deleted\n2026-04-27T20:28:53.051453Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.7MB → 0.3MB (18.4x), 25 JPEGs deleted\n^C2026-04-27T20:30:32.129537Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:30:32.130931Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:30:32.131010Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:30:32.131074Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:30:32.131039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:30:32.131133Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:30:32.131085Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:30:32.131290Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:30:32.131334Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:30:32.138634Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:30:32.286550Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:30:32.287619Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:30:54.735165Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:30:54.797709Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:30:55.472614Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:30:55.475859Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:30:55.475892Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:30:55.476036Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:30:55.476044Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:30:55.476057Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:30:55.476105Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:30:55.476106Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:30:55.476655Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:30:55.478599Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:30:55.478870Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:30:55.479291Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:30:55.479475Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:30:55.479705Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:30:55.480173Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:30:55.480195Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:30:55.482746Z INFO screenpipe: starting UI event capture\n2026-04-27T20:30:55.482271Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T20:30:55.489318Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:30:55.490977Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:30:55.499721Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:30:55.515391Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:30:55.515493Z INFO screenpipe_engine::ui_recorder: UI recording session started: c94c9344-e31e-4db3-a794-faa7352ffc62\n2026-04-27T20:30:55.515697Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:30:55.515694 UTC to 2026-04-27 17:30:55.515694 UTC)\n2026-04-27T20:30:55.516149Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:30:55.524148Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:30:55.530896Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:30:55.737812Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:30:55.737864Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.737908Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.869687Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:30:55.869717Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:30:55.869731Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:30:55.869750Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)","is_focused":true},{"role":"AXTextField","text":"retention","depth":3,"bounds":{"left":0.7888889,"top":0.10555556,"width":0.13055556,"height":0.024444444},"automation_id":"_NS:65","value":"retention","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.7902778,"top":0.10555556,"width":0.017361112,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.9013889,"top":0.10555556,"width":0.015277778,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.925,"top":0.10666667,"width":0.014583333,"height":0.023333333},"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.93958336,"top":0.10666667,"width":0.014583333,"height":0.023333333},"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-95-134:~ (tail)","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.47083333,"top":0.033333335,"width":0.058333334,"height":0.017777778},"role_description":"text"}]...
|
-3596382804963053315
|
7216369437532337521
|
manual
|
accessibility
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
NULL
|
NULL
|
|
90242
|
2455
|
32
|
2026-04-27T17:30:56.370696+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-27/1777 /Users/lukas/.screenpipe/data/data/2026-04-27/1777311056370_m2.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:27:23.708271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:27:23.857140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:27:24.535232Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:27:24.536622Z INFO screenpipe: stopping UI event capture\n\n2026-04-27T20:27:24.536751Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:27:24.536810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:27:24.536876Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:27:24.537910Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager \n2026-04-27T20:27:24.537937Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:27:24.538217Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:27:24.538354Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:27:24.550217Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:27:24.665575Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:27:24.665646Z INFO screenpipe: shutdown complete\nnpx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:27:40.109271Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:27:40.171419Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T20:27:40.783105Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:27:40.784956Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:27:40.785423Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:27:40.825160Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:27:40.825230Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:27:40.825425Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:27:40.825522Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:27:40.825535Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:27:40.825448Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:27:40.825589Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:27:40.839746Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:27:40.846623Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:27:40.846844Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:27:40.847335Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:27:40.847511Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:27:40.847677Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:27:40.848142Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:27:40.848156Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n2026-04-27T20:27:40.848964Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T20:27:40.852124Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:27:40.862411Z INFO screenpipe: starting UI event capture\n2026-04-27T20:27:40.878161Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:27:40.894556Z INFO screenpipe_engine::ui_recorder: UI recording session started: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:27:40.894598Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:27:40.894637Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:27:40.894634 UTC to 2026-04-27 17:27:40.894634 UTC)\n2026-04-27T20:27:40.895369Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:27:40.902580Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:27:40.910282Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:27:41.214017Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:27:41.214052Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.214116Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.381988Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:27:41.382022Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:27:41.382038Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:27:41.382045Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:27:41.382086Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:27:42.095403Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:27:42.253405Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:42.462118Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90191, dur=129ms\n2026-04-27T20:27:42.463860Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T20:27:42.693627Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90192, dur=77ms\n2026-04-27T20:27:51.381510Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:51.712562Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7532 elapsed=10.816977375s\n2026-04-27T20:27:51.737118Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7531 frame entries, coverage from 2026-04-26 17:27:40.894634 UTC\n2026-04-27T20:27:56.962882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:28:49.821781Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=51 elapsed=8.990252667s\n2026-04-27T20:28:49.821906Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 51 eligible frames\n2026-04-27T20:28:51.481884Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 8.0MB → 0.5MB (14.8x), 24 JPEGs deleted\n2026-04-27T20:28:53.051453Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.7MB → 0.3MB (18.4x), 25 JPEGs deleted\n^C2026-04-27T20:30:32.129537Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:30:32.130931Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:30:32.131010Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:30:32.131074Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:30:32.131039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:30:32.131133Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:30:32.131085Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:30:32.131290Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:30:32.131334Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:30:32.138634Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:30:32.286550Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:30:32.287619Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:30:54.735165Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:30:54.797709Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:30:55.472614Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:30:55.475859Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:30:55.475892Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:30:55.476036Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:30:55.476044Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:30:55.476057Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:30:55.476105Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:30:55.476106Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:30:55.476655Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:30:55.478599Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:30:55.478870Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:30:55.479291Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:30:55.479475Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:30:55.479705Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:30:55.480173Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:30:55.480195Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:30:55.482746Z INFO screenpipe: starting UI event capture\n2026-04-27T20:30:55.482271Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T20:30:55.489318Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:30:55.490977Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:30:55.499721Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:30:55.515391Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:30:55.515493Z INFO screenpipe_engine::ui_recorder: UI recording session started: c94c9344-e31e-4db3-a794-faa7352ffc62\n2026-04-27T20:30:55.515697Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:30:55.515694 UTC to 2026-04-27 17:30:55.515694 UTC)\n2026-04-27T20:30:55.516149Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:30:55.524148Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:30:55.530896Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:30:55.737812Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:30:55.737864Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.737908Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.869687Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:30:55.869717Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:30:55.869731Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:30:55.869750Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:30:56.694562Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:30:56.835897Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90241, dur=85ms\n2026-04-27T20:30:56.861755Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)","depth":4,"value":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:27:23.708271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:27:23.857140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:27:24.535232Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:27:24.536622Z INFO screenpipe: stopping UI event capture\n\n2026-04-27T20:27:24.536751Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:27:24.536810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:27:24.536876Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:27:24.537910Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager \n2026-04-27T20:27:24.537937Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:27:24.538217Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:27:24.538354Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:27:24.550217Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:27:24.665575Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:27:24.665646Z INFO screenpipe: shutdown complete\nnpx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:27:40.109271Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:27:40.171419Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T20:27:40.783105Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:27:40.784956Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:27:40.785423Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:27:40.825160Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:27:40.825230Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:27:40.825425Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:27:40.825522Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:27:40.825535Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:27:40.825448Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:27:40.825589Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:27:40.839746Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:27:40.846623Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:27:40.846844Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:27:40.847335Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:27:40.847511Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:27:40.847677Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:27:40.848142Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:27:40.848156Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n2026-04-27T20:27:40.848964Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T20:27:40.852124Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:27:40.862411Z INFO screenpipe: starting UI event capture\n2026-04-27T20:27:40.878161Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:27:40.894556Z INFO screenpipe_engine::ui_recorder: UI recording session started: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:27:40.894598Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:27:40.894637Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:27:40.894634 UTC to 2026-04-27 17:27:40.894634 UTC)\n2026-04-27T20:27:40.895369Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:27:40.902580Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:27:40.910282Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:27:41.214017Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:27:41.214052Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.214116Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.381988Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:27:41.382022Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:27:41.382038Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:27:41.382045Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:27:41.382086Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:27:42.095403Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:27:42.253405Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:42.462118Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90191, dur=129ms\n2026-04-27T20:27:42.463860Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T20:27:42.693627Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90192, dur=77ms\n2026-04-27T20:27:51.381510Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:51.712562Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7532 elapsed=10.816977375s\n2026-04-27T20:27:51.737118Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7531 frame entries, coverage from 2026-04-26 17:27:40.894634 UTC\n2026-04-27T20:27:56.962882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:28:49.821781Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=51 elapsed=8.990252667s\n2026-04-27T20:28:49.821906Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 51 eligible frames\n2026-04-27T20:28:51.481884Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 8.0MB → 0.5MB (14.8x), 24 JPEGs deleted\n2026-04-27T20:28:53.051453Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.7MB → 0.3MB (18.4x), 25 JPEGs deleted\n^C2026-04-27T20:30:32.129537Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:30:32.130931Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:30:32.131010Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:30:32.131074Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:30:32.131039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:30:32.131133Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:30:32.131085Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:30:32.131290Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:30:32.131334Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:30:32.138634Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:30:32.286550Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:30:32.287619Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:30:54.735165Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:30:54.797709Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:30:55.472614Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:30:55.475859Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:30:55.475892Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:30:55.476036Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:30:55.476044Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:30:55.476057Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:30:55.476105Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:30:55.476106Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:30:55.476655Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:30:55.478599Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:30:55.478870Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:30:55.479291Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:30:55.479475Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:30:55.479705Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:30:55.480173Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:30:55.480195Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:30:55.482746Z INFO screenpipe: starting UI event capture\n2026-04-27T20:30:55.482271Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T20:30:55.489318Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:30:55.490977Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:30:55.499721Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:30:55.515391Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:30:55.515493Z INFO screenpipe_engine::ui_recorder: UI recording session started: c94c9344-e31e-4db3-a794-faa7352ffc62\n2026-04-27T20:30:55.515697Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:30:55.515694 UTC to 2026-04-27 17:30:55.515694 UTC)\n2026-04-27T20:30:55.516149Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:30:55.524148Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:30:55.530896Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:30:55.737812Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:30:55.737864Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.737908Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.869687Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:30:55.869717Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:30:55.869731Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:30:55.869750Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:30:56.694562Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:30:56.835897Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90241, dur=85ms\n2026-04-27T20:30:56.861755Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)","is_focused":true},{"role":"AXTextField","text":"retention","depth":3,"bounds":{"left":0.64793885,"top":1.0,"width":0.0625,"height":-0.07581806},"automation_id":"_NS:65","value":"retention","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.64860374,"top":1.0,"width":0.00831117,"height":-0.07581806},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.7017952,"top":1.0,"width":0.00731383,"height":-0.07581806},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.7130984,"top":1.0,"width":0.006981383,"height":-0.07661617},"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.7200798,"top":1.0,"width":0.006981383,"height":-0.07661617},"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.3487367,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.35073137,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.42719415,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42918882,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.58410907,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.58610374,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-95-134:~ (tail)","depth":2,"bounds":{"left":0.6625665,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.66456115,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.4956782,"top":1.0,"width":0.027925532,"height":-0.02394259},"role_description":"text"}]...
|
-3596382804963053315
|
7216369437532337521
|
manual
|
accessibility
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
NULL
|
NULL
|
|
90249
|
2455
|
36
|
2026-04-27T17:32:03.367904+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-27/1777 /Users/lukas/.screenpipe/data/data/2026-04-27/1777311123367_m2.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:27:23.708271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:27:23.857140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:27:24.535232Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:27:24.536622Z INFO screenpipe: stopping UI event capture\n\n2026-04-27T20:27:24.536751Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:27:24.536810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:27:24.536876Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:27:24.537910Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager \n2026-04-27T20:27:24.537937Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:27:24.538217Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:27:24.538354Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:27:24.550217Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:27:24.665575Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:27:24.665646Z INFO screenpipe: shutdown complete\nnpx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:27:40.109271Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:27:40.171419Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T20:27:40.783105Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:27:40.784956Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:27:40.785423Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:27:40.825160Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:27:40.825230Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:27:40.825425Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:27:40.825522Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:27:40.825535Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:27:40.825448Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:27:40.825589Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:27:40.839746Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:27:40.846623Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:27:40.846844Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:27:40.847335Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:27:40.847511Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:27:40.847677Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:27:40.848142Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:27:40.848156Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n2026-04-27T20:27:40.848964Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T20:27:40.852124Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:27:40.862411Z INFO screenpipe: starting UI event capture\n2026-04-27T20:27:40.878161Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:27:40.894556Z INFO screenpipe_engine::ui_recorder: UI recording session started: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:27:40.894598Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:27:40.894637Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:27:40.894634 UTC to 2026-04-27 17:27:40.894634 UTC)\n2026-04-27T20:27:40.895369Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:27:40.902580Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:27:40.910282Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:27:41.214017Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:27:41.214052Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.214116Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.381988Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:27:41.382022Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:27:41.382038Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:27:41.382045Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:27:41.382086Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:27:42.095403Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:27:42.253405Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:42.462118Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90191, dur=129ms\n2026-04-27T20:27:42.463860Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T20:27:42.693627Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90192, dur=77ms\n2026-04-27T20:27:51.381510Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:51.712562Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7532 elapsed=10.816977375s\n2026-04-27T20:27:51.737118Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7531 frame entries, coverage from 2026-04-26 17:27:40.894634 UTC\n2026-04-27T20:27:56.962882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:28:49.821781Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=51 elapsed=8.990252667s\n2026-04-27T20:28:49.821906Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 51 eligible frames\n2026-04-27T20:28:51.481884Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 8.0MB → 0.5MB (14.8x), 24 JPEGs deleted\n2026-04-27T20:28:53.051453Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.7MB → 0.3MB (18.4x), 25 JPEGs deleted\n^C2026-04-27T20:30:32.129537Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:30:32.130931Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:30:32.131010Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:30:32.131074Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:30:32.131039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:30:32.131133Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:30:32.131085Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:30:32.131290Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:30:32.131334Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:30:32.138634Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:30:32.286550Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:30:32.287619Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:30:54.735165Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:30:54.797709Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:30:55.472614Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:30:55.475859Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:30:55.475892Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:30:55.476036Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:30:55.476044Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:30:55.476057Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:30:55.476105Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:30:55.476106Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:30:55.476655Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:30:55.478599Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:30:55.478870Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:30:55.479291Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:30:55.479475Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:30:55.479705Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:30:55.480173Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:30:55.480195Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:30:55.482746Z INFO screenpipe: starting UI event capture\n2026-04-27T20:30:55.482271Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T20:30:55.489318Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:30:55.490977Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:30:55.499721Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:30:55.515391Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:30:55.515493Z INFO screenpipe_engine::ui_recorder: UI recording session started: c94c9344-e31e-4db3-a794-faa7352ffc62\n2026-04-27T20:30:55.515697Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:30:55.515694 UTC to 2026-04-27 17:30:55.515694 UTC)\n2026-04-27T20:30:55.516149Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:30:55.524148Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:30:55.530896Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:30:55.737812Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:30:55.737864Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.737908Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.869687Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:30:55.869717Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:30:55.869731Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:30:55.869750Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:30:56.694562Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:30:56.835897Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90241, dur=85ms\n2026-04-27T20:30:56.861755Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:30:57.038581Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90242, dur=125ms\n2026-04-27T20:31:06.990117Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7540 elapsed=11.473505667s\n2026-04-27T20:31:07.027453Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7539 frame entries, coverage from 2026-04-26 17:30:55.515694 UTC","depth":4,"value":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:27:23.708271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:27:23.857140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:27:24.535232Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:27:24.536622Z INFO screenpipe: stopping UI event capture\n\n2026-04-27T20:27:24.536751Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:27:24.536810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:27:24.536876Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:27:24.537910Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager \n2026-04-27T20:27:24.537937Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:27:24.538217Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:27:24.538354Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:27:24.550217Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:27:24.665575Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:27:24.665646Z INFO screenpipe: shutdown complete\nnpx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:27:40.109271Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:27:40.171419Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T20:27:40.783105Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:27:40.784956Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:27:40.785423Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:27:40.825160Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:27:40.825230Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:27:40.825425Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:27:40.825522Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:27:40.825535Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:27:40.825448Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:27:40.825589Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:27:40.839746Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:27:40.846623Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:27:40.846844Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:27:40.847335Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:27:40.847511Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:27:40.847677Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:27:40.848142Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:27:40.848156Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n2026-04-27T20:27:40.848964Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T20:27:40.852124Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:27:40.862411Z INFO screenpipe: starting UI event capture\n2026-04-27T20:27:40.878161Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:27:40.894556Z INFO screenpipe_engine::ui_recorder: UI recording session started: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:27:40.894598Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:27:40.894637Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:27:40.894634 UTC to 2026-04-27 17:27:40.894634 UTC)\n2026-04-27T20:27:40.895369Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:27:40.902580Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:27:40.910282Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:27:41.214017Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:27:41.214052Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.214116Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.381988Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:27:41.382022Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:27:41.382038Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:27:41.382045Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:27:41.382086Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:27:42.095403Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:27:42.253405Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:42.462118Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90191, dur=129ms\n2026-04-27T20:27:42.463860Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T20:27:42.693627Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90192, dur=77ms\n2026-04-27T20:27:51.381510Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:51.712562Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7532 elapsed=10.816977375s\n2026-04-27T20:27:51.737118Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7531 frame entries, coverage from 2026-04-26 17:27:40.894634 UTC\n2026-04-27T20:27:56.962882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:28:49.821781Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=51 elapsed=8.990252667s\n2026-04-27T20:28:49.821906Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 51 eligible frames\n2026-04-27T20:28:51.481884Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 8.0MB → 0.5MB (14.8x), 24 JPEGs deleted\n2026-04-27T20:28:53.051453Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.7MB → 0.3MB (18.4x), 25 JPEGs deleted\n^C2026-04-27T20:30:32.129537Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:30:32.130931Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:30:32.131010Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:30:32.131074Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:30:32.131039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:30:32.131133Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:30:32.131085Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:30:32.131290Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:30:32.131334Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:30:32.138634Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:30:32.286550Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:30:32.287619Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:30:54.735165Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:30:54.797709Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:30:55.472614Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:30:55.475859Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:30:55.475892Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:30:55.476036Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:30:55.476044Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:30:55.476057Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:30:55.476105Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:30:55.476106Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:30:55.476655Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:30:55.478599Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:30:55.478870Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:30:55.479291Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:30:55.479475Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:30:55.479705Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:30:55.480173Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:30:55.480195Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:30:55.482746Z INFO screenpipe: starting UI event capture\n2026-04-27T20:30:55.482271Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T20:30:55.489318Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:30:55.490977Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:30:55.499721Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:30:55.515391Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:30:55.515493Z INFO screenpipe_engine::ui_recorder: UI recording session started: c94c9344-e31e-4db3-a794-faa7352ffc62\n2026-04-27T20:30:55.515697Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:30:55.515694 UTC to 2026-04-27 17:30:55.515694 UTC)\n2026-04-27T20:30:55.516149Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:30:55.524148Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:30:55.530896Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:30:55.737812Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:30:55.737864Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.737908Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.869687Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:30:55.869717Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:30:55.869731Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:30:55.869750Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:30:56.694562Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:30:56.835897Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90241, dur=85ms\n2026-04-27T20:30:56.861755Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:30:57.038581Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90242, dur=125ms\n2026-04-27T20:31:06.990117Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7540 elapsed=11.473505667s\n2026-04-27T20:31:07.027453Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7539 frame entries, coverage from 2026-04-26 17:30:55.515694 UTC","is_focused":true},{"role":"AXTextField","text":"retention","depth":3,"bounds":{"left":0.64793885,"top":1.0,"width":0.0625,"height":-0.07581806},"automation_id":"_NS:65","value":"retention","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.64860374,"top":1.0,"width":0.00831117,"height":-0.07581806},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.7017952,"top":1.0,"width":0.00731383,"height":-0.07581806},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.7130984,"top":1.0,"width":0.006981383,"height":-0.07661617},"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.7200798,"top":1.0,"width":0.006981383,"height":-0.07661617},"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.3487367,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.35073137,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.42719415,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42918882,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.58410907,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.58610374,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-95-134:~ (tail)","depth":2,"bounds":{"left":0.6625665,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.66456115,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.4956782,"top":1.0,"width":0.027925532,"height":-0.02394259},"role_description":"text"}]...
|
-3596382804963053315
|
7216369437532337521
|
click
|
accessibility
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
NULL
|
NULL
|
|
90250
|
2453
|
26
|
2026-04-27T17:32:03.367792+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-27/1777 /Users/lukas/.screenpipe/data/data/2026-04-27/1777311123367_m1.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:27:23.708271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:27:23.857140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:27:24.535232Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:27:24.536622Z INFO screenpipe: stopping UI event capture\n\n2026-04-27T20:27:24.536751Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:27:24.536810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:27:24.536876Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:27:24.537910Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager \n2026-04-27T20:27:24.537937Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:27:24.538217Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:27:24.538354Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:27:24.550217Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:27:24.665575Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:27:24.665646Z INFO screenpipe: shutdown complete\nnpx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:27:40.109271Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:27:40.171419Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T20:27:40.783105Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:27:40.784956Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:27:40.785423Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:27:40.825160Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:27:40.825230Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:27:40.825425Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:27:40.825522Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:27:40.825535Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:27:40.825448Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:27:40.825589Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:27:40.839746Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:27:40.846623Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:27:40.846844Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:27:40.847335Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:27:40.847511Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:27:40.847677Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:27:40.848142Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:27:40.848156Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n2026-04-27T20:27:40.848964Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T20:27:40.852124Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:27:40.862411Z INFO screenpipe: starting UI event capture\n2026-04-27T20:27:40.878161Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:27:40.894556Z INFO screenpipe_engine::ui_recorder: UI recording session started: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:27:40.894598Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:27:40.894637Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:27:40.894634 UTC to 2026-04-27 17:27:40.894634 UTC)\n2026-04-27T20:27:40.895369Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:27:40.902580Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:27:40.910282Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:27:41.214017Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:27:41.214052Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.214116Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.381988Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:27:41.382022Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:27:41.382038Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:27:41.382045Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:27:41.382086Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:27:42.095403Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:27:42.253405Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:42.462118Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90191, dur=129ms\n2026-04-27T20:27:42.463860Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T20:27:42.693627Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90192, dur=77ms\n2026-04-27T20:27:51.381510Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:51.712562Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7532 elapsed=10.816977375s\n2026-04-27T20:27:51.737118Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7531 frame entries, coverage from 2026-04-26 17:27:40.894634 UTC\n2026-04-27T20:27:56.962882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:28:49.821781Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=51 elapsed=8.990252667s\n2026-04-27T20:28:49.821906Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 51 eligible frames\n2026-04-27T20:28:51.481884Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 8.0MB → 0.5MB (14.8x), 24 JPEGs deleted\n2026-04-27T20:28:53.051453Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.7MB → 0.3MB (18.4x), 25 JPEGs deleted\n^C2026-04-27T20:30:32.129537Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:30:32.130931Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:30:32.131010Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:30:32.131074Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:30:32.131039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:30:32.131133Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:30:32.131085Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:30:32.131290Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:30:32.131334Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:30:32.138634Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:30:32.286550Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:30:32.287619Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:30:54.735165Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:30:54.797709Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:30:55.472614Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:30:55.475859Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:30:55.475892Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:30:55.476036Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:30:55.476044Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:30:55.476057Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:30:55.476105Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:30:55.476106Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:30:55.476655Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:30:55.478599Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:30:55.478870Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:30:55.479291Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:30:55.479475Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:30:55.479705Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:30:55.480173Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:30:55.480195Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:30:55.482746Z INFO screenpipe: starting UI event capture\n2026-04-27T20:30:55.482271Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T20:30:55.489318Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:30:55.490977Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:30:55.499721Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:30:55.515391Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:30:55.515493Z INFO screenpipe_engine::ui_recorder: UI recording session started: c94c9344-e31e-4db3-a794-faa7352ffc62\n2026-04-27T20:30:55.515697Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:30:55.515694 UTC to 2026-04-27 17:30:55.515694 UTC)\n2026-04-27T20:30:55.516149Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:30:55.524148Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:30:55.530896Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:30:55.737812Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:30:55.737864Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.737908Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.869687Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:30:55.869717Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:30:55.869731Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:30:55.869750Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:30:56.694562Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:30:56.835897Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90241, dur=85ms\n2026-04-27T20:30:56.861755Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:30:57.038581Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90242, dur=125ms\n2026-04-27T20:31:06.990117Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7540 elapsed=11.473505667s\n2026-04-27T20:31:07.027453Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7539 frame entries, coverage from 2026-04-26 17:30:55.515694 UTC","depth":4,"value":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:27:23.708271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:27:23.857140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:27:24.535232Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:27:24.536622Z INFO screenpipe: stopping UI event capture\n\n2026-04-27T20:27:24.536751Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:27:24.536810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:27:24.536876Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:27:24.537910Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager \n2026-04-27T20:27:24.537937Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:27:24.538217Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:27:24.538354Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:27:24.550217Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:27:24.665575Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:27:24.665646Z INFO screenpipe: shutdown complete\nnpx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:27:40.109271Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:27:40.171419Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T20:27:40.783105Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:27:40.784956Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:27:40.785423Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:27:40.825160Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:27:40.825230Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:27:40.825425Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:27:40.825522Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:27:40.825535Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:27:40.825448Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:27:40.825589Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:27:40.839746Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:27:40.846623Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:27:40.846844Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:27:40.847335Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:27:40.847511Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:27:40.847677Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:27:40.848142Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:27:40.848156Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n2026-04-27T20:27:40.848964Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T20:27:40.852124Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:27:40.862411Z INFO screenpipe: starting UI event capture\n2026-04-27T20:27:40.878161Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:27:40.894556Z INFO screenpipe_engine::ui_recorder: UI recording session started: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:27:40.894598Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:27:40.894637Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:27:40.894634 UTC to 2026-04-27 17:27:40.894634 UTC)\n2026-04-27T20:27:40.895369Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:27:40.902580Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:27:40.910282Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:27:41.214017Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:27:41.214052Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.214116Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.381988Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:27:41.382022Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:27:41.382038Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:27:41.382045Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:27:41.382086Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:27:42.095403Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:27:42.253405Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:42.462118Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90191, dur=129ms\n2026-04-27T20:27:42.463860Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T20:27:42.693627Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90192, dur=77ms\n2026-04-27T20:27:51.381510Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:51.712562Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7532 elapsed=10.816977375s\n2026-04-27T20:27:51.737118Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7531 frame entries, coverage from 2026-04-26 17:27:40.894634 UTC\n2026-04-27T20:27:56.962882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:28:49.821781Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=51 elapsed=8.990252667s\n2026-04-27T20:28:49.821906Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 51 eligible frames\n2026-04-27T20:28:51.481884Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 8.0MB → 0.5MB (14.8x), 24 JPEGs deleted\n2026-04-27T20:28:53.051453Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.7MB → 0.3MB (18.4x), 25 JPEGs deleted\n^C2026-04-27T20:30:32.129537Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:30:32.130931Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:30:32.131010Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:30:32.131074Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:30:32.131039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:30:32.131133Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:30:32.131085Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:30:32.131290Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:30:32.131334Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:30:32.138634Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:30:32.286550Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:30:32.287619Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:30:54.735165Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:30:54.797709Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:30:55.472614Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:30:55.475859Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:30:55.475892Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:30:55.476036Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:30:55.476044Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:30:55.476057Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:30:55.476105Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:30:55.476106Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:30:55.476655Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:30:55.478599Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:30:55.478870Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:30:55.479291Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:30:55.479475Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:30:55.479705Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:30:55.480173Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:30:55.480195Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:30:55.482746Z INFO screenpipe: starting UI event capture\n2026-04-27T20:30:55.482271Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T20:30:55.489318Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:30:55.490977Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:30:55.499721Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:30:55.515391Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:30:55.515493Z INFO screenpipe_engine::ui_recorder: UI recording session started: c94c9344-e31e-4db3-a794-faa7352ffc62\n2026-04-27T20:30:55.515697Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:30:55.515694 UTC to 2026-04-27 17:30:55.515694 UTC)\n2026-04-27T20:30:55.516149Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:30:55.524148Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:30:55.530896Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:30:55.737812Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:30:55.737864Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.737908Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.869687Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:30:55.869717Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:30:55.869731Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:30:55.869750Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:30:56.694562Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:30:56.835897Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90241, dur=85ms\n2026-04-27T20:30:56.861755Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:30:57.038581Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90242, dur=125ms\n2026-04-27T20:31:06.990117Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7540 elapsed=11.473505667s\n2026-04-27T20:31:07.027453Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7539 frame entries, coverage from 2026-04-26 17:30:55.515694 UTC","is_focused":true},{"role":"AXTextField","text":"retention","depth":3,"bounds":{"left":0.7888889,"top":0.10555556,"width":0.13055556,"height":0.024444444},"automation_id":"_NS:65","value":"retention","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.7902778,"top":0.10555556,"width":0.017361112,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.9013889,"top":0.10555556,"width":0.015277778,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.925,"top":0.10666667,"width":0.014583333,"height":0.023333333},"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.93958336,"top":0.10666667,"width":0.014583333,"height":0.023333333},"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-95-134:~ (tail)","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.47083333,"top":0.033333335,"width":0.058333334,"height":0.017777778},"role_description":"text"}]...
|
-3596382804963053315
|
7216369437532337521
|
click
|
accessibility
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
NULL
|
NULL
|
|
90521
|
2454
|
60
|
2026-04-27T17:42:14.974359+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-27/1777 /Users/lukas/.screenpipe/data/data/2026-04-27/1777311734974_m1.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:27:23.708271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:27:23.857140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:27:24.535232Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:27:24.536622Z INFO screenpipe: stopping UI event capture\n\n2026-04-27T20:27:24.536751Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:27:24.536810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:27:24.536876Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:27:24.537910Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager \n2026-04-27T20:27:24.537937Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:27:24.538217Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:27:24.538354Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:27:24.550217Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:27:24.665575Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:27:24.665646Z INFO screenpipe: shutdown complete\nnpx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:27:40.109271Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:27:40.171419Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T20:27:40.783105Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:27:40.784956Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:27:40.785423Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:27:40.825160Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:27:40.825230Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:27:40.825425Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:27:40.825522Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:27:40.825535Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:27:40.825448Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:27:40.825589Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:27:40.839746Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:27:40.846623Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:27:40.846844Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:27:40.847335Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:27:40.847511Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:27:40.847677Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:27:40.848142Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:27:40.848156Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n2026-04-27T20:27:40.848964Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T20:27:40.852124Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:27:40.862411Z INFO screenpipe: starting UI event capture\n2026-04-27T20:27:40.878161Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:27:40.894556Z INFO screenpipe_engine::ui_recorder: UI recording session started: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:27:40.894598Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:27:40.894637Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:27:40.894634 UTC to 2026-04-27 17:27:40.894634 UTC)\n2026-04-27T20:27:40.895369Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:27:40.902580Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:27:40.910282Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:27:41.214017Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:27:41.214052Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.214116Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.381988Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:27:41.382022Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:27:41.382038Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:27:41.382045Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:27:41.382086Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:27:42.095403Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:27:42.253405Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:42.462118Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90191, dur=129ms\n2026-04-27T20:27:42.463860Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T20:27:42.693627Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90192, dur=77ms\n2026-04-27T20:27:51.381510Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:51.712562Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7532 elapsed=10.816977375s\n2026-04-27T20:27:51.737118Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7531 frame entries, coverage from 2026-04-26 17:27:40.894634 UTC\n2026-04-27T20:27:56.962882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:28:49.821781Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=51 elapsed=8.990252667s\n2026-04-27T20:28:49.821906Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 51 eligible frames\n2026-04-27T20:28:51.481884Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 8.0MB → 0.5MB (14.8x), 24 JPEGs deleted\n2026-04-27T20:28:53.051453Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.7MB → 0.3MB (18.4x), 25 JPEGs deleted\n^C2026-04-27T20:30:32.129537Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:30:32.130931Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:30:32.131010Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:30:32.131074Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:30:32.131039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:30:32.131133Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:30:32.131085Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:30:32.131290Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:30:32.131334Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:30:32.138634Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:30:32.286550Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:30:32.287619Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:30:54.735165Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:30:54.797709Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:30:55.472614Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:30:55.475859Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:30:55.475892Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:30:55.476036Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:30:55.476044Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:30:55.476057Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:30:55.476105Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:30:55.476106Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:30:55.476655Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:30:55.478599Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:30:55.478870Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:30:55.479291Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:30:55.479475Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:30:55.479705Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:30:55.480173Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:30:55.480195Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:30:55.482746Z INFO screenpipe: starting UI event capture\n2026-04-27T20:30:55.482271Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T20:30:55.489318Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:30:55.490977Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:30:55.499721Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:30:55.515391Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:30:55.515493Z INFO screenpipe_engine::ui_recorder: UI recording session started: c94c9344-e31e-4db3-a794-faa7352ffc62\n2026-04-27T20:30:55.515697Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:30:55.515694 UTC to 2026-04-27 17:30:55.515694 UTC)\n2026-04-27T20:30:55.516149Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:30:55.524148Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:30:55.530896Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:30:55.737812Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:30:55.737864Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.737908Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.869687Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:30:55.869717Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:30:55.869731Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:30:55.869750Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:30:56.694562Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:30:56.835897Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90241, dur=85ms\n2026-04-27T20:30:56.861755Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:30:57.038581Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90242, dur=125ms\n2026-04-27T20:31:06.990117Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7540 elapsed=11.473505667s\n2026-04-27T20:31:07.027453Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7539 frame entries, coverage from 2026-04-26 17:30:55.515694 UTC\n2026-04-27T20:32:04.352887Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=338 elapsed=1.609685292s\n2026-04-27T20:32:04.544815Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=45 elapsed=9.06576025s\n2026-04-27T20:32:04.544911Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 45 eligible frames\n2026-04-27T20:32:05.793956Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:32:06.951226Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 5.2MB → 3.3MB (1.6x), 22 JPEGs deleted\n2026-04-27T20:32:08.751698Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.1MB → 0.7MB (4.4x), 21 JPEGs deleted\n2026-04-27T20:32:20.197912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2338985759867801519, trigger=click)\n2026-04-27T20:32:43.107353Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5366113786402399547, trigger=visual_change)\n2026-04-27T20:33:13.387330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7820901224464693596, trigger=visual_change)\n2026-04-27T20:33:36.962004Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-792722415084285626, trigger=visual_change)\n2026-04-27T20:33:52.788506Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-792722415084285626, trigger=visual_change)\n2026-04-27T20:34:03.058144Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1911463890682293842, trigger=click)\n2026-04-27T20:37:13.371019Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=338 elapsed=1.548607875s\n2026-04-27T20:37:18.754243Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=63 elapsed=9.994003083s\n2026-04-27T20:37:18.754867Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 63 eligible frames\n2026-04-27T20:37:20.546963Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 26 frames, 6.1MB → 0.4MB (15.6x), 26 JPEGs deleted\n2026-04-27T20:37:22.922351Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 35 frames, 5.0MB → 1.2MB (4.1x), 35 JPEGs deleted\n2026-04-27T20:37:59.040947Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2264186727250956418, trigger=click)\n2026-04-27T20:37:59.126830Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2264186727250956418, trigger=click)","depth":4,"value":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:27:23.708271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:27:23.857140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:27:24.535232Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:27:24.536622Z INFO screenpipe: stopping UI event capture\n\n2026-04-27T20:27:24.536751Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:27:24.536810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:27:24.536876Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:27:24.537910Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager \n2026-04-27T20:27:24.537937Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:27:24.538217Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:27:24.538354Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:27:24.550217Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:27:24.665575Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:27:24.665646Z INFO screenpipe: shutdown complete\nnpx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:27:40.109271Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:27:40.171419Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T20:27:40.783105Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:27:40.784956Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:27:40.785423Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:27:40.825160Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:27:40.825230Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:27:40.825425Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:27:40.825522Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:27:40.825535Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:27:40.825448Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:27:40.825589Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:27:40.839746Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:27:40.846623Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:27:40.846844Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:27:40.847335Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:27:40.847511Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:27:40.847677Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:27:40.848142Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:27:40.848156Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n2026-04-27T20:27:40.848964Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T20:27:40.852124Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:27:40.862411Z INFO screenpipe: starting UI event capture\n2026-04-27T20:27:40.878161Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:27:40.894556Z INFO screenpipe_engine::ui_recorder: UI recording session started: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:27:40.894598Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:27:40.894637Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:27:40.894634 UTC to 2026-04-27 17:27:40.894634 UTC)\n2026-04-27T20:27:40.895369Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:27:40.902580Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:27:40.910282Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:27:41.214017Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:27:41.214052Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.214116Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.381988Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:27:41.382022Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:27:41.382038Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:27:41.382045Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:27:41.382086Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:27:42.095403Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:27:42.253405Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:42.462118Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90191, dur=129ms\n2026-04-27T20:27:42.463860Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T20:27:42.693627Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90192, dur=77ms\n2026-04-27T20:27:51.381510Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:51.712562Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7532 elapsed=10.816977375s\n2026-04-27T20:27:51.737118Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7531 frame entries, coverage from 2026-04-26 17:27:40.894634 UTC\n2026-04-27T20:27:56.962882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:28:49.821781Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=51 elapsed=8.990252667s\n2026-04-27T20:28:49.821906Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 51 eligible frames\n2026-04-27T20:28:51.481884Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 8.0MB → 0.5MB (14.8x), 24 JPEGs deleted\n2026-04-27T20:28:53.051453Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.7MB → 0.3MB (18.4x), 25 JPEGs deleted\n^C2026-04-27T20:30:32.129537Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:30:32.130931Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:30:32.131010Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:30:32.131074Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:30:32.131039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:30:32.131133Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:30:32.131085Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:30:32.131290Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:30:32.131334Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:30:32.138634Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:30:32.286550Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:30:32.287619Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:30:54.735165Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:30:54.797709Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:30:55.472614Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:30:55.475859Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:30:55.475892Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:30:55.476036Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:30:55.476044Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:30:55.476057Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:30:55.476105Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:30:55.476106Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:30:55.476655Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:30:55.478599Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:30:55.478870Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:30:55.479291Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:30:55.479475Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:30:55.479705Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:30:55.480173Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:30:55.480195Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:30:55.482746Z INFO screenpipe: starting UI event capture\n2026-04-27T20:30:55.482271Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T20:30:55.489318Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:30:55.490977Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:30:55.499721Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:30:55.515391Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:30:55.515493Z INFO screenpipe_engine::ui_recorder: UI recording session started: c94c9344-e31e-4db3-a794-faa7352ffc62\n2026-04-27T20:30:55.515697Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:30:55.515694 UTC to 2026-04-27 17:30:55.515694 UTC)\n2026-04-27T20:30:55.516149Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:30:55.524148Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:30:55.530896Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:30:55.737812Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:30:55.737864Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.737908Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.869687Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:30:55.869717Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:30:55.869731Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:30:55.869750Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:30:56.694562Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:30:56.835897Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90241, dur=85ms\n2026-04-27T20:30:56.861755Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:30:57.038581Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90242, dur=125ms\n2026-04-27T20:31:06.990117Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7540 elapsed=11.473505667s\n2026-04-27T20:31:07.027453Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7539 frame entries, coverage from 2026-04-26 17:30:55.515694 UTC\n2026-04-27T20:32:04.352887Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=338 elapsed=1.609685292s\n2026-04-27T20:32:04.544815Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=45 elapsed=9.06576025s\n2026-04-27T20:32:04.544911Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 45 eligible frames\n2026-04-27T20:32:05.793956Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:32:06.951226Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 5.2MB → 3.3MB (1.6x), 22 JPEGs deleted\n2026-04-27T20:32:08.751698Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.1MB → 0.7MB (4.4x), 21 JPEGs deleted\n2026-04-27T20:32:20.197912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2338985759867801519, trigger=click)\n2026-04-27T20:32:43.107353Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5366113786402399547, trigger=visual_change)\n2026-04-27T20:33:13.387330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7820901224464693596, trigger=visual_change)\n2026-04-27T20:33:36.962004Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-792722415084285626, trigger=visual_change)\n2026-04-27T20:33:52.788506Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-792722415084285626, trigger=visual_change)\n2026-04-27T20:34:03.058144Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1911463890682293842, trigger=click)\n2026-04-27T20:37:13.371019Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=338 elapsed=1.548607875s\n2026-04-27T20:37:18.754243Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=63 elapsed=9.994003083s\n2026-04-27T20:37:18.754867Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 63 eligible frames\n2026-04-27T20:37:20.546963Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 26 frames, 6.1MB → 0.4MB (15.6x), 26 JPEGs deleted\n2026-04-27T20:37:22.922351Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 35 frames, 5.0MB → 1.2MB (4.1x), 35 JPEGs deleted\n2026-04-27T20:37:59.040947Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2264186727250956418, trigger=click)\n2026-04-27T20:37:59.126830Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2264186727250956418, trigger=click)","is_focused":true},{"role":"AXTextField","text":"retention","depth":3,"bounds":{"left":0.7888889,"top":0.10555556,"width":0.13055556,"height":0.024444444},"automation_id":"_NS:65","value":"retention","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.7902778,"top":0.10555556,"width":0.017361112,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.9013889,"top":0.10555556,"width":0.015277778,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.925,"top":0.10666667,"width":0.014583333,"height":0.023333333},"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.93958336,"top":0.10666667,"width":0.014583333,"height":0.023333333},"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-95-134:~ (tail)","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.47083333,"top":0.033333335,"width":0.058333334,"height":0.017777778},"role_description":"text"}]...
|
-3596382804963053315
|
7216369437532337521
|
click
|
accessibility
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
90500
|
NULL
|
|
90522
|
2456
|
76
|
2026-04-27T17:42:15.212960+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-27/1777 /Users/lukas/.screenpipe/data/data/2026-04-27/1777311735212_m2.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:27:23.708271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:27:23.857140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:27:24.535232Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:27:24.536622Z INFO screenpipe: stopping UI event capture\n\n2026-04-27T20:27:24.536751Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:27:24.536810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:27:24.536876Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:27:24.537910Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager \n2026-04-27T20:27:24.537937Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:27:24.538217Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:27:24.538354Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:27:24.550217Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:27:24.665575Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:27:24.665646Z INFO screenpipe: shutdown complete\nnpx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:27:40.109271Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:27:40.171419Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T20:27:40.783105Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:27:40.784956Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:27:40.785423Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:27:40.825160Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:27:40.825230Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:27:40.825425Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:27:40.825522Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:27:40.825535Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:27:40.825448Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:27:40.825589Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:27:40.839746Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:27:40.846623Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:27:40.846844Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:27:40.847335Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:27:40.847511Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:27:40.847677Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:27:40.848142Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:27:40.848156Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n2026-04-27T20:27:40.848964Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T20:27:40.852124Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:27:40.862411Z INFO screenpipe: starting UI event capture\n2026-04-27T20:27:40.878161Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:27:40.894556Z INFO screenpipe_engine::ui_recorder: UI recording session started: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:27:40.894598Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:27:40.894637Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:27:40.894634 UTC to 2026-04-27 17:27:40.894634 UTC)\n2026-04-27T20:27:40.895369Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:27:40.902580Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:27:40.910282Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:27:41.214017Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:27:41.214052Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.214116Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.381988Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:27:41.382022Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:27:41.382038Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:27:41.382045Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:27:41.382086Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:27:42.095403Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:27:42.253405Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:42.462118Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90191, dur=129ms\n2026-04-27T20:27:42.463860Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T20:27:42.693627Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90192, dur=77ms\n2026-04-27T20:27:51.381510Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:51.712562Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7532 elapsed=10.816977375s\n2026-04-27T20:27:51.737118Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7531 frame entries, coverage from 2026-04-26 17:27:40.894634 UTC\n2026-04-27T20:27:56.962882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:28:49.821781Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=51 elapsed=8.990252667s\n2026-04-27T20:28:49.821906Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 51 eligible frames\n2026-04-27T20:28:51.481884Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 8.0MB → 0.5MB (14.8x), 24 JPEGs deleted\n2026-04-27T20:28:53.051453Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.7MB → 0.3MB (18.4x), 25 JPEGs deleted\n^C2026-04-27T20:30:32.129537Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:30:32.130931Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:30:32.131010Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:30:32.131074Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:30:32.131039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:30:32.131133Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:30:32.131085Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:30:32.131290Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:30:32.131334Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:30:32.138634Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:30:32.286550Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:30:32.287619Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:30:54.735165Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:30:54.797709Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:30:55.472614Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:30:55.475859Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:30:55.475892Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:30:55.476036Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:30:55.476044Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:30:55.476057Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:30:55.476105Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:30:55.476106Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:30:55.476655Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:30:55.478599Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:30:55.478870Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:30:55.479291Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:30:55.479475Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:30:55.479705Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:30:55.480173Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:30:55.480195Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:30:55.482746Z INFO screenpipe: starting UI event capture\n2026-04-27T20:30:55.482271Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T20:30:55.489318Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:30:55.490977Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:30:55.499721Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:30:55.515391Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:30:55.515493Z INFO screenpipe_engine::ui_recorder: UI recording session started: c94c9344-e31e-4db3-a794-faa7352ffc62\n2026-04-27T20:30:55.515697Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:30:55.515694 UTC to 2026-04-27 17:30:55.515694 UTC)\n2026-04-27T20:30:55.516149Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:30:55.524148Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:30:55.530896Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:30:55.737812Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:30:55.737864Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.737908Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.869687Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:30:55.869717Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:30:55.869731Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:30:55.869750Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:30:56.694562Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:30:56.835897Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90241, dur=85ms\n2026-04-27T20:30:56.861755Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:30:57.038581Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90242, dur=125ms\n2026-04-27T20:31:06.990117Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7540 elapsed=11.473505667s\n2026-04-27T20:31:07.027453Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7539 frame entries, coverage from 2026-04-26 17:30:55.515694 UTC\n2026-04-27T20:32:04.352887Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=338 elapsed=1.609685292s\n2026-04-27T20:32:04.544815Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=45 elapsed=9.06576025s\n2026-04-27T20:32:04.544911Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 45 eligible frames\n2026-04-27T20:32:05.793956Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:32:06.951226Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 5.2MB → 3.3MB (1.6x), 22 JPEGs deleted\n2026-04-27T20:32:08.751698Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.1MB → 0.7MB (4.4x), 21 JPEGs deleted\n2026-04-27T20:32:20.197912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2338985759867801519, trigger=click)\n2026-04-27T20:32:43.107353Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5366113786402399547, trigger=visual_change)\n2026-04-27T20:33:13.387330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7820901224464693596, trigger=visual_change)\n2026-04-27T20:33:36.962004Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-792722415084285626, trigger=visual_change)\n2026-04-27T20:33:52.788506Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-792722415084285626, trigger=visual_change)\n2026-04-27T20:34:03.058144Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1911463890682293842, trigger=click)\n2026-04-27T20:37:13.371019Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=338 elapsed=1.548607875s\n2026-04-27T20:37:18.754243Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=63 elapsed=9.994003083s\n2026-04-27T20:37:18.754867Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 63 eligible frames\n2026-04-27T20:37:20.546963Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 26 frames, 6.1MB → 0.4MB (15.6x), 26 JPEGs deleted\n2026-04-27T20:37:22.922351Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 35 frames, 5.0MB → 1.2MB (4.1x), 35 JPEGs deleted\n2026-04-27T20:37:59.040947Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2264186727250956418, trigger=click)\n2026-04-27T20:37:59.126830Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2264186727250956418, trigger=click)","depth":4,"value":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:27:23.708271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:27:23.857140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:27:24.535232Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:27:24.536622Z INFO screenpipe: stopping UI event capture\n\n2026-04-27T20:27:24.536751Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:27:24.536810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:27:24.536876Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:27:24.537910Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager \n2026-04-27T20:27:24.537937Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:27:24.538217Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:27:24.538354Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:27:24.550217Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:27:24.665575Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:27:24.665646Z INFO screenpipe: shutdown complete\nnpx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:27:40.109271Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:27:40.171419Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T20:27:40.783105Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:27:40.784956Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:27:40.785423Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:27:40.825160Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:27:40.825230Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:27:40.825425Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:27:40.825522Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:27:40.825535Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:27:40.825448Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:27:40.825589Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:27:40.839746Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:27:40.846623Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:27:40.846844Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:27:40.847335Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:27:40.847511Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:27:40.847677Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:27:40.848142Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:27:40.848156Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n2026-04-27T20:27:40.848964Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T20:27:40.852124Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:27:40.862411Z INFO screenpipe: starting UI event capture\n2026-04-27T20:27:40.878161Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:27:40.894556Z INFO screenpipe_engine::ui_recorder: UI recording session started: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:27:40.894598Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:27:40.894637Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:27:40.894634 UTC to 2026-04-27 17:27:40.894634 UTC)\n2026-04-27T20:27:40.895369Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:27:40.902580Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:27:40.910282Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:27:41.214017Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:27:41.214052Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.214116Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.381988Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:27:41.382022Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:27:41.382038Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:27:41.382045Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:27:41.382086Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:27:42.095403Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:27:42.253405Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:42.462118Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90191, dur=129ms\n2026-04-27T20:27:42.463860Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T20:27:42.693627Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90192, dur=77ms\n2026-04-27T20:27:51.381510Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:51.712562Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7532 elapsed=10.816977375s\n2026-04-27T20:27:51.737118Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7531 frame entries, coverage from 2026-04-26 17:27:40.894634 UTC\n2026-04-27T20:27:56.962882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:28:49.821781Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=51 elapsed=8.990252667s\n2026-04-27T20:28:49.821906Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 51 eligible frames\n2026-04-27T20:28:51.481884Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 8.0MB → 0.5MB (14.8x), 24 JPEGs deleted\n2026-04-27T20:28:53.051453Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.7MB → 0.3MB (18.4x), 25 JPEGs deleted\n^C2026-04-27T20:30:32.129537Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:30:32.130931Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:30:32.131010Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:30:32.131074Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:30:32.131039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:30:32.131133Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:30:32.131085Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:30:32.131290Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:30:32.131334Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:30:32.138634Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:30:32.286550Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:30:32.287619Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:30:54.735165Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:30:54.797709Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:30:55.472614Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:30:55.475859Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:30:55.475892Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:30:55.476036Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:30:55.476044Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:30:55.476057Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:30:55.476105Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:30:55.476106Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:30:55.476655Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:30:55.478599Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:30:55.478870Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:30:55.479291Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:30:55.479475Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:30:55.479705Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:30:55.480173Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:30:55.480195Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:30:55.482746Z INFO screenpipe: starting UI event capture\n2026-04-27T20:30:55.482271Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T20:30:55.489318Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:30:55.490977Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:30:55.499721Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:30:55.515391Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:30:55.515493Z INFO screenpipe_engine::ui_recorder: UI recording session started: c94c9344-e31e-4db3-a794-faa7352ffc62\n2026-04-27T20:30:55.515697Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:30:55.515694 UTC to 2026-04-27 17:30:55.515694 UTC)\n2026-04-27T20:30:55.516149Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:30:55.524148Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:30:55.530896Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:30:55.737812Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:30:55.737864Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.737908Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.869687Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:30:55.869717Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:30:55.869731Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:30:55.869750Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:30:56.694562Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:30:56.835897Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90241, dur=85ms\n2026-04-27T20:30:56.861755Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:30:57.038581Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90242, dur=125ms\n2026-04-27T20:31:06.990117Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7540 elapsed=11.473505667s\n2026-04-27T20:31:07.027453Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7539 frame entries, coverage from 2026-04-26 17:30:55.515694 UTC\n2026-04-27T20:32:04.352887Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=338 elapsed=1.609685292s\n2026-04-27T20:32:04.544815Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=45 elapsed=9.06576025s\n2026-04-27T20:32:04.544911Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 45 eligible frames\n2026-04-27T20:32:05.793956Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:32:06.951226Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 5.2MB → 3.3MB (1.6x), 22 JPEGs deleted\n2026-04-27T20:32:08.751698Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.1MB → 0.7MB (4.4x), 21 JPEGs deleted\n2026-04-27T20:32:20.197912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2338985759867801519, trigger=click)\n2026-04-27T20:32:43.107353Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5366113786402399547, trigger=visual_change)\n2026-04-27T20:33:13.387330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7820901224464693596, trigger=visual_change)\n2026-04-27T20:33:36.962004Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-792722415084285626, trigger=visual_change)\n2026-04-27T20:33:52.788506Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-792722415084285626, trigger=visual_change)\n2026-04-27T20:34:03.058144Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1911463890682293842, trigger=click)\n2026-04-27T20:37:13.371019Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=338 elapsed=1.548607875s\n2026-04-27T20:37:18.754243Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=63 elapsed=9.994003083s\n2026-04-27T20:37:18.754867Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 63 eligible frames\n2026-04-27T20:37:20.546963Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 26 frames, 6.1MB → 0.4MB (15.6x), 26 JPEGs deleted\n2026-04-27T20:37:22.922351Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 35 frames, 5.0MB → 1.2MB (4.1x), 35 JPEGs deleted\n2026-04-27T20:37:59.040947Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2264186727250956418, trigger=click)\n2026-04-27T20:37:59.126830Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2264186727250956418, trigger=click)","is_focused":true},{"role":"AXTextField","text":"retention","depth":3,"bounds":{"left":0.64793885,"top":1.0,"width":0.0625,"height":-0.07581806},"automation_id":"_NS:65","value":"retention","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.64860374,"top":1.0,"width":0.00831117,"height":-0.07581806},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.7017952,"top":1.0,"width":0.00731383,"height":-0.07581806},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.7130984,"top":1.0,"width":0.006981383,"height":-0.07661617},"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.7200798,"top":1.0,"width":0.006981383,"height":-0.07661617},"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.3487367,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.35073137,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.42719415,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42918882,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.58410907,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.58610374,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-95-134:~ (tail)","depth":2,"bounds":{"left":0.6625665,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.66456115,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.4956782,"top":1.0,"width":0.027925532,"height":-0.02394259},"role_description":"text"}]...
|
-3596382804963053315
|
7216369437532337521
|
click
|
accessibility
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
90501
|
NULL
|
|
90523
|
NULL
|
0
|
2026-04-27T17:42:15.936484+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-27/1777 /Users/lukas/.screenpipe/data/data/2026-04-27/1777311735936_m1.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:27:23.708271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:27:23.857140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:27:24.535232Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:27:24.536622Z INFO screenpipe: stopping UI event capture\n\n2026-04-27T20:27:24.536751Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:27:24.536810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:27:24.536876Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:27:24.537910Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager \n2026-04-27T20:27:24.537937Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:27:24.538217Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:27:24.538354Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:27:24.550217Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:27:24.665575Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:27:24.665646Z INFO screenpipe: shutdown complete\nnpx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:27:40.109271Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:27:40.171419Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T20:27:40.783105Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:27:40.784956Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:27:40.785423Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:27:40.825160Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:27:40.825230Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:27:40.825425Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:27:40.825522Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:27:40.825535Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:27:40.825448Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:27:40.825589Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:27:40.839746Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:27:40.846623Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:27:40.846844Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:27:40.847335Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:27:40.847511Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:27:40.847677Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:27:40.848142Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:27:40.848156Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n2026-04-27T20:27:40.848964Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T20:27:40.852124Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:27:40.862411Z INFO screenpipe: starting UI event capture\n2026-04-27T20:27:40.878161Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:27:40.894556Z INFO screenpipe_engine::ui_recorder: UI recording session started: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:27:40.894598Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:27:40.894637Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:27:40.894634 UTC to 2026-04-27 17:27:40.894634 UTC)\n2026-04-27T20:27:40.895369Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:27:40.902580Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:27:40.910282Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:27:41.214017Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:27:41.214052Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.214116Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.381988Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:27:41.382022Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:27:41.382038Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:27:41.382045Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:27:41.382086Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:27:42.095403Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:27:42.253405Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:42.462118Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90191, dur=129ms\n2026-04-27T20:27:42.463860Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T20:27:42.693627Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90192, dur=77ms\n2026-04-27T20:27:51.381510Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:51.712562Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7532 elapsed=10.816977375s\n2026-04-27T20:27:51.737118Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7531 frame entries, coverage from 2026-04-26 17:27:40.894634 UTC\n2026-04-27T20:27:56.962882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:28:49.821781Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=51 elapsed=8.990252667s\n2026-04-27T20:28:49.821906Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 51 eligible frames\n2026-04-27T20:28:51.481884Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 8.0MB → 0.5MB (14.8x), 24 JPEGs deleted\n2026-04-27T20:28:53.051453Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.7MB → 0.3MB (18.4x), 25 JPEGs deleted\n^C2026-04-27T20:30:32.129537Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:30:32.130931Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:30:32.131010Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:30:32.131074Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:30:32.131039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:30:32.131133Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:30:32.131085Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:30:32.131290Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:30:32.131334Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:30:32.138634Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:30:32.286550Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:30:32.287619Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:30:54.735165Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:30:54.797709Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:30:55.472614Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:30:55.475859Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:30:55.475892Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:30:55.476036Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:30:55.476044Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:30:55.476057Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:30:55.476105Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:30:55.476106Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:30:55.476655Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:30:55.478599Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:30:55.478870Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:30:55.479291Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:30:55.479475Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:30:55.479705Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:30:55.480173Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:30:55.480195Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:30:55.482746Z INFO screenpipe: starting UI event capture\n2026-04-27T20:30:55.482271Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T20:30:55.489318Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:30:55.490977Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:30:55.499721Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:30:55.515391Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:30:55.515493Z INFO screenpipe_engine::ui_recorder: UI recording session started: c94c9344-e31e-4db3-a794-faa7352ffc62\n2026-04-27T20:30:55.515697Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:30:55.515694 UTC to 2026-04-27 17:30:55.515694 UTC)\n2026-04-27T20:30:55.516149Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:30:55.524148Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:30:55.530896Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:30:55.737812Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:30:55.737864Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.737908Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.869687Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:30:55.869717Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:30:55.869731Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:30:55.869750Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:30:56.694562Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:30:56.835897Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90241, dur=85ms\n2026-04-27T20:30:56.861755Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:30:57.038581Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90242, dur=125ms\n2026-04-27T20:31:06.990117Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7540 elapsed=11.473505667s\n2026-04-27T20:31:07.027453Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7539 frame entries, coverage from 2026-04-26 17:30:55.515694 UTC\n2026-04-27T20:32:04.352887Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=338 elapsed=1.609685292s\n2026-04-27T20:32:04.544815Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=45 elapsed=9.06576025s\n2026-04-27T20:32:04.544911Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 45 eligible frames\n2026-04-27T20:32:05.793956Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:32:06.951226Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 5.2MB → 3.3MB (1.6x), 22 JPEGs deleted\n2026-04-27T20:32:08.751698Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.1MB → 0.7MB (4.4x), 21 JPEGs deleted\n2026-04-27T20:32:20.197912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2338985759867801519, trigger=click)\n2026-04-27T20:32:43.107353Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5366113786402399547, trigger=visual_change)\n2026-04-27T20:33:13.387330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7820901224464693596, trigger=visual_change)\n2026-04-27T20:33:36.962004Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-792722415084285626, trigger=visual_change)\n2026-04-27T20:33:52.788506Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-792722415084285626, trigger=visual_change)\n2026-04-27T20:34:03.058144Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1911463890682293842, trigger=click)\n2026-04-27T20:37:13.371019Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=338 elapsed=1.548607875s\n2026-04-27T20:37:18.754243Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=63 elapsed=9.994003083s\n2026-04-27T20:37:18.754867Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 63 eligible frames\n2026-04-27T20:37:20.546963Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 26 frames, 6.1MB → 0.4MB (15.6x), 26 JPEGs deleted\n2026-04-27T20:37:22.922351Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 35 frames, 5.0MB → 1.2MB (4.1x), 35 JPEGs deleted\n2026-04-27T20:37:59.040947Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2264186727250956418, trigger=click)\n2026-04-27T20:37:59.126830Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2264186727250956418, trigger=click)","depth":4,"value":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:27:23.708271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:27:23.857140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:27:24.535232Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:27:24.536622Z INFO screenpipe: stopping UI event capture\n\n2026-04-27T20:27:24.536751Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:27:24.536810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:27:24.536876Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:27:24.537910Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager \n2026-04-27T20:27:24.537937Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:27:24.538217Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:27:24.538354Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:27:24.550217Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:27:24.665575Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:27:24.665646Z INFO screenpipe: shutdown complete\nnpx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:27:40.109271Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:27:40.171419Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T20:27:40.783105Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:27:40.784956Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:27:40.785423Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:27:40.825160Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:27:40.825230Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:27:40.825425Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:27:40.825522Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:27:40.825535Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:27:40.825448Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:27:40.825589Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:27:40.839746Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:27:40.846623Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:27:40.846844Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:27:40.847335Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:27:40.847511Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:27:40.847677Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:27:40.848142Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:27:40.848156Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n2026-04-27T20:27:40.848964Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T20:27:40.852124Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:27:40.862411Z INFO screenpipe: starting UI event capture\n2026-04-27T20:27:40.878161Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:27:40.894556Z INFO screenpipe_engine::ui_recorder: UI recording session started: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:27:40.894598Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:27:40.894637Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:27:40.894634 UTC to 2026-04-27 17:27:40.894634 UTC)\n2026-04-27T20:27:40.895369Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:27:40.902580Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:27:40.910282Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:27:41.214017Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:27:41.214052Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.214116Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.381988Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:27:41.382022Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:27:41.382038Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:27:41.382045Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:27:41.382086Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:27:42.095403Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:27:42.253405Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:42.462118Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90191, dur=129ms\n2026-04-27T20:27:42.463860Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T20:27:42.693627Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90192, dur=77ms\n2026-04-27T20:27:51.381510Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:51.712562Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7532 elapsed=10.816977375s\n2026-04-27T20:27:51.737118Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7531 frame entries, coverage from 2026-04-26 17:27:40.894634 UTC\n2026-04-27T20:27:56.962882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:28:49.821781Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=51 elapsed=8.990252667s\n2026-04-27T20:28:49.821906Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 51 eligible frames\n2026-04-27T20:28:51.481884Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 8.0MB → 0.5MB (14.8x), 24 JPEGs deleted\n2026-04-27T20:28:53.051453Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.7MB → 0.3MB (18.4x), 25 JPEGs deleted\n^C2026-04-27T20:30:32.129537Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:30:32.130931Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:30:32.131010Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:30:32.131074Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:30:32.131039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:30:32.131133Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:30:32.131085Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:30:32.131290Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:30:32.131334Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:30:32.138634Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:30:32.286550Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:30:32.287619Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:30:54.735165Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:30:54.797709Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:30:55.472614Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:30:55.475859Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:30:55.475892Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:30:55.476036Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:30:55.476044Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:30:55.476057Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:30:55.476105Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:30:55.476106Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:30:55.476655Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:30:55.478599Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:30:55.478870Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:30:55.479291Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:30:55.479475Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:30:55.479705Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:30:55.480173Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:30:55.480195Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:30:55.482746Z INFO screenpipe: starting UI event capture\n2026-04-27T20:30:55.482271Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T20:30:55.489318Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:30:55.490977Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:30:55.499721Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:30:55.515391Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:30:55.515493Z INFO screenpipe_engine::ui_recorder: UI recording session started: c94c9344-e31e-4db3-a794-faa7352ffc62\n2026-04-27T20:30:55.515697Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:30:55.515694 UTC to 2026-04-27 17:30:55.515694 UTC)\n2026-04-27T20:30:55.516149Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:30:55.524148Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:30:55.530896Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:30:55.737812Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:30:55.737864Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.737908Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.869687Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:30:55.869717Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:30:55.869731Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:30:55.869750Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:30:56.694562Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:30:56.835897Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90241, dur=85ms\n2026-04-27T20:30:56.861755Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:30:57.038581Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90242, dur=125ms\n2026-04-27T20:31:06.990117Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7540 elapsed=11.473505667s\n2026-04-27T20:31:07.027453Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7539 frame entries, coverage from 2026-04-26 17:30:55.515694 UTC\n2026-04-27T20:32:04.352887Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=338 elapsed=1.609685292s\n2026-04-27T20:32:04.544815Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=45 elapsed=9.06576025s\n2026-04-27T20:32:04.544911Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 45 eligible frames\n2026-04-27T20:32:05.793956Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:32:06.951226Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 5.2MB → 3.3MB (1.6x), 22 JPEGs deleted\n2026-04-27T20:32:08.751698Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.1MB → 0.7MB (4.4x), 21 JPEGs deleted\n2026-04-27T20:32:20.197912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2338985759867801519, trigger=click)\n2026-04-27T20:32:43.107353Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5366113786402399547, trigger=visual_change)\n2026-04-27T20:33:13.387330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7820901224464693596, trigger=visual_change)\n2026-04-27T20:33:36.962004Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-792722415084285626, trigger=visual_change)\n2026-04-27T20:33:52.788506Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-792722415084285626, trigger=visual_change)\n2026-04-27T20:34:03.058144Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1911463890682293842, trigger=click)\n2026-04-27T20:37:13.371019Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=338 elapsed=1.548607875s\n2026-04-27T20:37:18.754243Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=63 elapsed=9.994003083s\n2026-04-27T20:37:18.754867Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 63 eligible frames\n2026-04-27T20:37:20.546963Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 26 frames, 6.1MB → 0.4MB (15.6x), 26 JPEGs deleted\n2026-04-27T20:37:22.922351Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 35 frames, 5.0MB → 1.2MB (4.1x), 35 JPEGs deleted\n2026-04-27T20:37:59.040947Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2264186727250956418, trigger=click)\n2026-04-27T20:37:59.126830Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2264186727250956418, trigger=click)","is_focused":true},{"role":"AXTextField","text":"retention","depth":3,"bounds":{"left":0.7888889,"top":0.10555556,"width":0.13055556,"height":0.024444444},"automation_id":"_NS:65","value":"retention","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.7902778,"top":0.10555556,"width":0.017361112,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.9013889,"top":0.10555556,"width":0.015277778,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.925,"top":0.10666667,"width":0.014583333,"height":0.023333333},"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.93958336,"top":0.10666667,"width":0.014583333,"height":0.023333333},"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-95-134:~ (tail)","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.47083333,"top":0.033333335,"width":0.058333334,"height":0.017777778},"role_description":"text"}]...
|
-3596382804963053315
|
7216369437532337521
|
click
|
accessibility
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
NULL
|
NULL
|
|
90524
|
NULL
|
0
|
2026-04-27T17:42:16.087826+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-27/1777 /Users/lukas/.screenpipe/data/data/2026-04-27/1777311736087_m2.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:27:23.708271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:27:23.857140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:27:24.535232Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:27:24.536622Z INFO screenpipe: stopping UI event capture\n\n2026-04-27T20:27:24.536751Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:27:24.536810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:27:24.536876Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:27:24.537910Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager \n2026-04-27T20:27:24.537937Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:27:24.538217Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:27:24.538354Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:27:24.550217Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:27:24.665575Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:27:24.665646Z INFO screenpipe: shutdown complete\nnpx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:27:40.109271Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:27:40.171419Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T20:27:40.783105Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:27:40.784956Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:27:40.785423Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:27:40.825160Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:27:40.825230Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:27:40.825425Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:27:40.825522Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:27:40.825535Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:27:40.825448Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:27:40.825589Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:27:40.839746Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:27:40.846623Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:27:40.846844Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:27:40.847335Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:27:40.847511Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:27:40.847677Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:27:40.848142Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:27:40.848156Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n2026-04-27T20:27:40.848964Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T20:27:40.852124Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:27:40.862411Z INFO screenpipe: starting UI event capture\n2026-04-27T20:27:40.878161Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:27:40.894556Z INFO screenpipe_engine::ui_recorder: UI recording session started: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:27:40.894598Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:27:40.894637Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:27:40.894634 UTC to 2026-04-27 17:27:40.894634 UTC)\n2026-04-27T20:27:40.895369Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:27:40.902580Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:27:40.910282Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:27:41.214017Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:27:41.214052Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.214116Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.381988Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:27:41.382022Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:27:41.382038Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:27:41.382045Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:27:41.382086Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:27:42.095403Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:27:42.253405Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:42.462118Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90191, dur=129ms\n2026-04-27T20:27:42.463860Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T20:27:42.693627Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90192, dur=77ms\n2026-04-27T20:27:51.381510Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:51.712562Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7532 elapsed=10.816977375s\n2026-04-27T20:27:51.737118Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7531 frame entries, coverage from 2026-04-26 17:27:40.894634 UTC\n2026-04-27T20:27:56.962882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:28:49.821781Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=51 elapsed=8.990252667s\n2026-04-27T20:28:49.821906Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 51 eligible frames\n2026-04-27T20:28:51.481884Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 8.0MB → 0.5MB (14.8x), 24 JPEGs deleted\n2026-04-27T20:28:53.051453Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.7MB → 0.3MB (18.4x), 25 JPEGs deleted\n^C2026-04-27T20:30:32.129537Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:30:32.130931Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:30:32.131010Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:30:32.131074Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:30:32.131039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:30:32.131133Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:30:32.131085Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:30:32.131290Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:30:32.131334Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:30:32.138634Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:30:32.286550Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:30:32.287619Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:30:54.735165Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:30:54.797709Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:30:55.472614Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:30:55.475859Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:30:55.475892Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:30:55.476036Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:30:55.476044Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:30:55.476057Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:30:55.476105Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:30:55.476106Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:30:55.476655Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:30:55.478599Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:30:55.478870Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:30:55.479291Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:30:55.479475Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:30:55.479705Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:30:55.480173Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:30:55.480195Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:30:55.482746Z INFO screenpipe: starting UI event capture\n2026-04-27T20:30:55.482271Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T20:30:55.489318Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:30:55.490977Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:30:55.499721Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:30:55.515391Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:30:55.515493Z INFO screenpipe_engine::ui_recorder: UI recording session started: c94c9344-e31e-4db3-a794-faa7352ffc62\n2026-04-27T20:30:55.515697Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:30:55.515694 UTC to 2026-04-27 17:30:55.515694 UTC)\n2026-04-27T20:30:55.516149Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:30:55.524148Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:30:55.530896Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:30:55.737812Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:30:55.737864Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.737908Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.869687Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:30:55.869717Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:30:55.869731Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:30:55.869750Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:30:56.694562Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:30:56.835897Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90241, dur=85ms\n2026-04-27T20:30:56.861755Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:30:57.038581Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90242, dur=125ms\n2026-04-27T20:31:06.990117Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7540 elapsed=11.473505667s\n2026-04-27T20:31:07.027453Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7539 frame entries, coverage from 2026-04-26 17:30:55.515694 UTC\n2026-04-27T20:32:04.352887Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=338 elapsed=1.609685292s\n2026-04-27T20:32:04.544815Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=45 elapsed=9.06576025s\n2026-04-27T20:32:04.544911Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 45 eligible frames\n2026-04-27T20:32:05.793956Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:32:06.951226Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 5.2MB → 3.3MB (1.6x), 22 JPEGs deleted\n2026-04-27T20:32:08.751698Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.1MB → 0.7MB (4.4x), 21 JPEGs deleted\n2026-04-27T20:32:20.197912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2338985759867801519, trigger=click)\n2026-04-27T20:32:43.107353Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5366113786402399547, trigger=visual_change)\n2026-04-27T20:33:13.387330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7820901224464693596, trigger=visual_change)\n2026-04-27T20:33:36.962004Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-792722415084285626, trigger=visual_change)\n2026-04-27T20:33:52.788506Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-792722415084285626, trigger=visual_change)\n2026-04-27T20:34:03.058144Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1911463890682293842, trigger=click)\n2026-04-27T20:37:13.371019Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=338 elapsed=1.548607875s\n2026-04-27T20:37:18.754243Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=63 elapsed=9.994003083s\n2026-04-27T20:37:18.754867Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 63 eligible frames\n2026-04-27T20:37:20.546963Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 26 frames, 6.1MB → 0.4MB (15.6x), 26 JPEGs deleted\n2026-04-27T20:37:22.922351Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 35 frames, 5.0MB → 1.2MB (4.1x), 35 JPEGs deleted\n2026-04-27T20:37:59.040947Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2264186727250956418, trigger=click)\n2026-04-27T20:37:59.126830Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2264186727250956418, trigger=click)","depth":4,"value":"2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2\n2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nerror: unexpected argument '--retention-days' found\n\nUsage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>\n\nFor more information, try '--help'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention\nnpm ERR! code ETARGET\nnpm ERR! notarget No matching version found for screenpipe@0.3.290.\nnpm ERR! notarget In most cases you or one of your dependencies are requesting\nnpm ERR! notarget a package version that doesn't exist.\n\nnpm ERR! A complete log of this run can be found in:\nnpm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log\nInstall for [ 'screenpipe@0.3.290' ] failed with code 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\\n' | grep -E \"0\\.3\\.(28|29)\"\n \"0.3.280\"\n \"0.3.281\"\n \"0.3.282\"\n \"0.3.283\"\n \"0.3.284\"\n \"0.3.285\"\n \"0.3.286\"\n \"0.3.287\"\n \"0.3.288\"\n \"0.3.289\"\n \"0.3.296\"\n \"0.3.297\"\n \"0.3.298\"\n \"0.3.299\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention\n --retention-days <RETENTION_DAYS>\n Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:27:23.708271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:27:23.857140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:27:24.535232Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:27:24.536622Z INFO screenpipe: stopping UI event capture\n\n2026-04-27T20:27:24.536751Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:27:24.536810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:27:24.536876Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:27:24.537910Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager \n2026-04-27T20:27:24.537937Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:27:24.538217Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:27:24.538354Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:27:24.550217Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:27:24.665575Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:27:24.665646Z INFO screenpipe: shutdown complete\nnpx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:27:40.109271Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:27:40.171419Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T20:27:40.783105Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:27:40.784956Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:27:40.785423Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:27:40.825160Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:27:40.825230Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:27:40.825425Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:27:40.825522Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:27:40.825535Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:27:40.825448Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:27:40.825589Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:27:40.839746Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:27:40.846623Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:27:40.846844Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:27:40.847335Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:27:40.847511Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:27:40.847677Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:27:40.848142Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:27:40.848156Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n2026-04-27T20:27:40.848964Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T20:27:40.852124Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:27:40.862411Z INFO screenpipe: starting UI event capture\n2026-04-27T20:27:40.878161Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:27:40.894556Z INFO screenpipe_engine::ui_recorder: UI recording session started: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:27:40.894598Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:27:40.894637Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:27:40.894634 UTC to 2026-04-27 17:27:40.894634 UTC)\n2026-04-27T20:27:40.895369Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:27:40.902580Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:27:40.910282Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:27:41.214017Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:27:41.214052Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.214116Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.381988Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:27:41.382022Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:27:41.382038Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:27:41.382045Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:27:41.382086Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:27:42.095403Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:27:42.253405Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:42.462118Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90191, dur=129ms\n2026-04-27T20:27:42.463860Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T20:27:42.693627Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90192, dur=77ms\n2026-04-27T20:27:51.381510Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:51.712562Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7532 elapsed=10.816977375s\n2026-04-27T20:27:51.737118Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7531 frame entries, coverage from 2026-04-26 17:27:40.894634 UTC\n2026-04-27T20:27:56.962882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:28:49.821781Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=51 elapsed=8.990252667s\n2026-04-27T20:28:49.821906Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 51 eligible frames\n2026-04-27T20:28:51.481884Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 8.0MB → 0.5MB (14.8x), 24 JPEGs deleted\n2026-04-27T20:28:53.051453Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.7MB → 0.3MB (18.4x), 25 JPEGs deleted\n^C2026-04-27T20:30:32.129537Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:30:32.130931Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:30:32.131010Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:30:32.131074Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:30:32.131039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:30:32.131133Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:30:32.131085Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:30:32.131290Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:30:32.131334Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:30:32.138634Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:30:32.286550Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:30:32.287619Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:30:54.735165Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:30:54.797709Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:30:55.472614Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:30:55.475859Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:30:55.475892Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:30:55.476036Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:30:55.476044Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:30:55.476057Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:30:55.476105Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:30:55.476106Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:30:55.476655Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:30:55.478599Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:30:55.478870Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:30:55.479291Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:30:55.479475Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:30:55.479705Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:30:55.480173Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:30:55.480195Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:30:55.482746Z INFO screenpipe: starting UI event capture\n2026-04-27T20:30:55.482271Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T20:30:55.489318Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:30:55.490977Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:30:55.499721Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:30:55.515391Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:30:55.515493Z INFO screenpipe_engine::ui_recorder: UI recording session started: c94c9344-e31e-4db3-a794-faa7352ffc62\n2026-04-27T20:30:55.515697Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:30:55.515694 UTC to 2026-04-27 17:30:55.515694 UTC)\n2026-04-27T20:30:55.516149Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:30:55.524148Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:30:55.530896Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:30:55.737812Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:30:55.737864Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.737908Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.869687Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:30:55.869717Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:30:55.869731Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:30:55.869750Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:30:56.694562Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:30:56.835897Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90241, dur=85ms\n2026-04-27T20:30:56.861755Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:30:57.038581Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90242, dur=125ms\n2026-04-27T20:31:06.990117Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7540 elapsed=11.473505667s\n2026-04-27T20:31:07.027453Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7539 frame entries, coverage from 2026-04-26 17:30:55.515694 UTC\n2026-04-27T20:32:04.352887Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=338 elapsed=1.609685292s\n2026-04-27T20:32:04.544815Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=45 elapsed=9.06576025s\n2026-04-27T20:32:04.544911Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 45 eligible frames\n2026-04-27T20:32:05.793956Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:32:06.951226Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 5.2MB → 3.3MB (1.6x), 22 JPEGs deleted\n2026-04-27T20:32:08.751698Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.1MB → 0.7MB (4.4x), 21 JPEGs deleted\n2026-04-27T20:32:20.197912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2338985759867801519, trigger=click)\n2026-04-27T20:32:43.107353Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5366113786402399547, trigger=visual_change)\n2026-04-27T20:33:13.387330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7820901224464693596, trigger=visual_change)\n2026-04-27T20:33:36.962004Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-792722415084285626, trigger=visual_change)\n2026-04-27T20:33:52.788506Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-792722415084285626, trigger=visual_change)\n2026-04-27T20:34:03.058144Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1911463890682293842, trigger=click)\n2026-04-27T20:37:13.371019Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=338 elapsed=1.548607875s\n2026-04-27T20:37:18.754243Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=63 elapsed=9.994003083s\n2026-04-27T20:37:18.754867Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 63 eligible frames\n2026-04-27T20:37:20.546963Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 26 frames, 6.1MB → 0.4MB (15.6x), 26 JPEGs deleted\n2026-04-27T20:37:22.922351Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 35 frames, 5.0MB → 1.2MB (4.1x), 35 JPEGs deleted\n2026-04-27T20:37:59.040947Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2264186727250956418, trigger=click)\n2026-04-27T20:37:59.126830Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2264186727250956418, trigger=click)","is_focused":true},{"role":"AXTextField","text":"retention","depth":3,"bounds":{"left":0.64793885,"top":1.0,"width":0.0625,"height":-0.07581806},"automation_id":"_NS:65","value":"retention","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.64860374,"top":1.0,"width":0.00831117,"height":-0.07581806},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.7017952,"top":1.0,"width":0.00731383,"height":-0.07581806},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.7130984,"top":1.0,"width":0.006981383,"height":-0.07661617},"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.7200798,"top":1.0,"width":0.006981383,"height":-0.07661617},"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.3487367,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.35073137,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.42719415,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42918882,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.58410907,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.58610374,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-95-134:~ (tail)","depth":2,"bounds":{"left":0.6625665,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.66456115,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.4956782,"top":1.0,"width":0.027925532,"height":-0.02394259},"role_description":"text"}]...
|
-3596382804963053315
|
7216369437532337521
|
click
|
accessibility
|
NULL
|
2026-04-27T19:53:16.843225Z INFO sck_rs::stream_m 2026-04-27T19:53:16.843225Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T19:53:16.997013Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 36105581-7ef0-435f-b17b-c7c03b8941e2
2026-04-27T19:53:16.997261Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
error: unexpected argument '--retention-days' found
Usage: screenpipe record --disable-audio --ignored-windows <IGNORED_WINDOWS>
For more information, try '--help'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.290 record --help | grep retention
npm ERR! code ETARGET
npm ERR! notarget No matching version found for screenpipe@0.3.290.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/lukas/.npm/_logs/2026-04-27T16_54_35_957Z-debug.log
Install for [ 'screenpipe@0.3.290' ] failed with code 1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npm view screenpipe versions --json | tr ',' '\n' | grep -E "0\.3\.(28|29)"
"0.3.280"
"0.3.281"
"0.3.282"
"0.3.283"
"0.3.284"
"0.3.285"
"0.3.286"
"0.3.287"
"0.3.288"
"0.3.289"
"0.3.296"
"0.3.297"
"0.3.298"
"0.3.299"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --help | grep retention
--retention-days <RETENTION_DAYS>
Local data retention in days. Old screen/audio data is auto-deleted after this period. Set to 0 to disable retention (keep data forever)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T19:56:30.302236Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T19:56:30.383950Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.289)
run: npx screenpipe@latest record
2026-04-27T19:56:31.026437Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T19:56:31.027969Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T19:56:31.028499Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T19:56:31.070702Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T19:56:31.070757Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T19:56:31.071006Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T19:56:31.071022Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T19:56:31.070960Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T19:56:31.070941Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T19:56:31.071159Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T19:56:31.083152Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T19:56:31.088269Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T19:56:31.088455Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T19:56:31.089010Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T19:56:31.089184Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T19:56:31.089338Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T19:56:31.089933Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T19:56:31.089949Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
202...
|
NULL
|
NULL
|
|
90525
|
2457
|
0
|
2026-04-28T06:18:09.064991+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-28/1777 /Users/lukas/.screenpipe/data/data/2026-04-28/1777357089064_m1.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
│ audio chunk duration │ 30 seconds │ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 7 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: https://github.com/screenpipe/screenpipe/releases
2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture
2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh
2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture
2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2
2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)
2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)
2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop s...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:27:23.708271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:27:23.857140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:27:24.535232Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:27:24.536622Z INFO screenpipe: stopping UI event capture\n\n2026-04-27T20:27:24.536751Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:27:24.536810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:27:24.536876Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:27:24.537910Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager \n2026-04-27T20:27:24.537937Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:27:24.538217Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:27:24.538354Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:27:24.550217Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:27:24.665575Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:27:24.665646Z INFO screenpipe: shutdown complete\nnpx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:27:40.109271Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:27:40.171419Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T20:27:40.783105Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:27:40.784956Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:27:40.785423Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:27:40.825160Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:27:40.825230Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:27:40.825425Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:27:40.825522Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:27:40.825535Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:27:40.825448Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:27:40.825589Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:27:40.839746Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:27:40.846623Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:27:40.846844Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:27:40.847335Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:27:40.847511Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:27:40.847677Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:27:40.848142Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:27:40.848156Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n2026-04-27T20:27:40.848964Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T20:27:40.852124Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:27:40.862411Z INFO screenpipe: starting UI event capture\n2026-04-27T20:27:40.878161Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:27:40.894556Z INFO screenpipe_engine::ui_recorder: UI recording session started: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:27:40.894598Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:27:40.894637Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:27:40.894634 UTC to 2026-04-27 17:27:40.894634 UTC)\n2026-04-27T20:27:40.895369Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:27:40.902580Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:27:40.910282Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:27:41.214017Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:27:41.214052Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.214116Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.381988Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:27:41.382022Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:27:41.382038Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:27:41.382045Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:27:41.382086Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:27:42.095403Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:27:42.253405Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:42.462118Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90191, dur=129ms\n2026-04-27T20:27:42.463860Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T20:27:42.693627Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90192, dur=77ms\n2026-04-27T20:27:51.381510Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:51.712562Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7532 elapsed=10.816977375s\n2026-04-27T20:27:51.737118Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7531 frame entries, coverage from 2026-04-26 17:27:40.894634 UTC\n2026-04-27T20:27:56.962882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:28:49.821781Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=51 elapsed=8.990252667s\n2026-04-27T20:28:49.821906Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 51 eligible frames\n2026-04-27T20:28:51.481884Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 8.0MB → 0.5MB (14.8x), 24 JPEGs deleted\n2026-04-27T20:28:53.051453Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.7MB → 0.3MB (18.4x), 25 JPEGs deleted\n^C2026-04-27T20:30:32.129537Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:30:32.130931Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:30:32.131010Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:30:32.131074Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:30:32.131039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:30:32.131133Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:30:32.131085Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:30:32.131290Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:30:32.131334Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:30:32.138634Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:30:32.286550Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:30:32.287619Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:30:54.735165Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:30:54.797709Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:30:55.472614Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:30:55.475859Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:30:55.475892Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:30:55.476036Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:30:55.476044Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:30:55.476057Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:30:55.476105Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:30:55.476106Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:30:55.476655Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:30:55.478599Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:30:55.478870Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:30:55.479291Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:30:55.479475Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:30:55.479705Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:30:55.480173Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:30:55.480195Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:30:55.482746Z INFO screenpipe: starting UI event capture\n2026-04-27T20:30:55.482271Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T20:30:55.489318Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:30:55.490977Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:30:55.499721Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:30:55.515391Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:30:55.515493Z INFO screenpipe_engine::ui_recorder: UI recording session started: c94c9344-e31e-4db3-a794-faa7352ffc62\n2026-04-27T20:30:55.515697Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:30:55.515694 UTC to 2026-04-27 17:30:55.515694 UTC)\n2026-04-27T20:30:55.516149Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:30:55.524148Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:30:55.530896Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:30:55.737812Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:30:55.737864Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.737908Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.869687Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:30:55.869717Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:30:55.869731Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:30:55.869750Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:30:56.694562Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:30:56.835897Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90241, dur=85ms\n2026-04-27T20:30:56.861755Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:30:57.038581Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90242, dur=125ms\n2026-04-27T20:31:06.990117Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7540 elapsed=11.473505667s\n2026-04-27T20:31:07.027453Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7539 frame entries, coverage from 2026-04-26 17:30:55.515694 UTC\n2026-04-27T20:32:04.352887Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=338 elapsed=1.609685292s\n2026-04-27T20:32:04.544815Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=45 elapsed=9.06576025s\n2026-04-27T20:32:04.544911Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 45 eligible frames\n2026-04-27T20:32:05.793956Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:32:06.951226Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 5.2MB → 3.3MB (1.6x), 22 JPEGs deleted\n2026-04-27T20:32:08.751698Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.1MB → 0.7MB (4.4x), 21 JPEGs deleted\n2026-04-27T20:32:20.197912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2338985759867801519, trigger=click)\n2026-04-27T20:32:43.107353Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5366113786402399547, trigger=visual_change)\n2026-04-27T20:33:13.387330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7820901224464693596, trigger=visual_change)\n2026-04-27T20:33:36.962004Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-792722415084285626, trigger=visual_change)\n2026-04-27T20:33:52.788506Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-792722415084285626, trigger=visual_change)\n2026-04-27T20:34:03.058144Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1911463890682293842, trigger=click)\n2026-04-27T20:37:13.371019Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=338 elapsed=1.548607875s\n2026-04-27T20:37:18.754243Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=63 elapsed=9.994003083s\n2026-04-27T20:37:18.754867Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 63 eligible frames\n2026-04-27T20:37:20.546963Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 26 frames, 6.1MB → 0.4MB (15.6x), 26 JPEGs deleted\n2026-04-27T20:37:22.922351Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 35 frames, 5.0MB → 1.2MB (4.1x), 35 JPEGs deleted\n2026-04-27T20:37:59.040947Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2264186727250956418, trigger=click)\n2026-04-27T20:37:59.126830Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2264186727250956418, trigger=click)\n2026-04-27T20:42:17.212397Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:42:17.341748Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:42:19.883370Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:42:19.885313Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:42:19.885440Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:42:19.885759Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:42:19.885721Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:42:19.887502Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:42:19.887547Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:42:19.887575Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:42:19.887675Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:42:19.895545Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:42:20.017957Z INFO screenpipe_engine::ui_recorder: UI recording session ended: c94c9344-e31e-4db3-a794-faa7352ffc62\n2026-04-27T20:42:20.018036Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ sp-start\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-28T09:18:07.393496Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-28T09:18:07.485649Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-28T09:18:08.096899Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-28T09:18:08.098605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-28T09:18:08.099212Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-28T09:18:08.120116Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-28T09:18:08.120175Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-28T09:18:08.120506Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-28T09:18:08.120523Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-28T09:18:08.120420Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-28T09:18:08.120460Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-28T09:18:08.120614Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-28T09:18:08.123907Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-28T09:18:08.124199Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-28T09:18:08.124410Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-28T09:18:08.124775Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-28T09:18:08.124954Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-28T09:18:08.125124Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-28T09:18:08.125143Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-28T09:18:08.126925Z INFO screenpipe: starting UI event capture\n2026-04-28T09:18:08.126221Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-28T09:18:08.135268Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-28T09:18:08.135595Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-28T09:18:08.140897Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-28T09:18:08.156086Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-28T09:18:08.156200Z INFO screenpipe_engine::ui_recorder: UI recording session started: 60a77b54-af9c-413a-9c55-187edee69d5c\n2026-04-28T09:18:08.156460Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-27 06:18:08.156457 UTC to 2026-04-28 06:18:08.156457 UTC)\n2026-04-28T09:18:08.156988Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-28T09:18:08.167538Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-28T09:18:08.174773Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-28T09:18:08.562937Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-28T09:18:08.562975Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-28T09:18:08.563029Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-28T09:18:08.763313Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-28T09:18:08.763354Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-28T09:18:08.763372Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-28T09:18:08.763380Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-28T09:18:08.763440Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-28T09:18:10.336498Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)","depth":4,"value":"│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:27:23.708271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:27:23.857140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:27:24.535232Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:27:24.536622Z INFO screenpipe: stopping UI event capture\n\n2026-04-27T20:27:24.536751Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:27:24.536810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:27:24.536876Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:27:24.537910Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager \n2026-04-27T20:27:24.537937Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:27:24.538217Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:27:24.538354Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:27:24.550217Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:27:24.665575Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:27:24.665646Z INFO screenpipe: shutdown complete\nnpx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:27:40.109271Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:27:40.171419Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T20:27:40.783105Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:27:40.784956Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:27:40.785423Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:27:40.825160Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:27:40.825230Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:27:40.825425Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:27:40.825522Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:27:40.825535Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:27:40.825448Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:27:40.825589Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:27:40.839746Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:27:40.846623Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:27:40.846844Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:27:40.847335Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:27:40.847511Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:27:40.847677Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:27:40.848142Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:27:40.848156Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n2026-04-27T20:27:40.848964Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T20:27:40.852124Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:27:40.862411Z INFO screenpipe: starting UI event capture\n2026-04-27T20:27:40.878161Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:27:40.894556Z INFO screenpipe_engine::ui_recorder: UI recording session started: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:27:40.894598Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:27:40.894637Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:27:40.894634 UTC to 2026-04-27 17:27:40.894634 UTC)\n2026-04-27T20:27:40.895369Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:27:40.902580Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:27:40.910282Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:27:41.214017Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:27:41.214052Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.214116Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.381988Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:27:41.382022Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:27:41.382038Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:27:41.382045Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:27:41.382086Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:27:42.095403Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:27:42.253405Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:42.462118Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90191, dur=129ms\n2026-04-27T20:27:42.463860Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T20:27:42.693627Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90192, dur=77ms\n2026-04-27T20:27:51.381510Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:51.712562Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7532 elapsed=10.816977375s\n2026-04-27T20:27:51.737118Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7531 frame entries, coverage from 2026-04-26 17:27:40.894634 UTC\n2026-04-27T20:27:56.962882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:28:49.821781Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=51 elapsed=8.990252667s\n2026-04-27T20:28:49.821906Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 51 eligible frames\n2026-04-27T20:28:51.481884Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 8.0MB → 0.5MB (14.8x), 24 JPEGs deleted\n2026-04-27T20:28:53.051453Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.7MB → 0.3MB (18.4x), 25 JPEGs deleted\n^C2026-04-27T20:30:32.129537Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:30:32.130931Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:30:32.131010Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:30:32.131074Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:30:32.131039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:30:32.131133Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:30:32.131085Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:30:32.131290Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:30:32.131334Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:30:32.138634Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:30:32.286550Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:30:32.287619Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:30:54.735165Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:30:54.797709Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:30:55.472614Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:30:55.475859Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:30:55.475892Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:30:55.476036Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:30:55.476044Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:30:55.476057Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:30:55.476105Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:30:55.476106Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:30:55.476655Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:30:55.478599Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:30:55.478870Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:30:55.479291Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:30:55.479475Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:30:55.479705Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:30:55.480173Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:30:55.480195Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:30:55.482746Z INFO screenpipe: starting UI event capture\n2026-04-27T20:30:55.482271Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T20:30:55.489318Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:30:55.490977Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:30:55.499721Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:30:55.515391Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:30:55.515493Z INFO screenpipe_engine::ui_recorder: UI recording session started: c94c9344-e31e-4db3-a794-faa7352ffc62\n2026-04-27T20:30:55.515697Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:30:55.515694 UTC to 2026-04-27 17:30:55.515694 UTC)\n2026-04-27T20:30:55.516149Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:30:55.524148Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:30:55.530896Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:30:55.737812Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:30:55.737864Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.737908Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.869687Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:30:55.869717Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:30:55.869731Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:30:55.869750Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:30:56.694562Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:30:56.835897Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90241, dur=85ms\n2026-04-27T20:30:56.861755Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:30:57.038581Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90242, dur=125ms\n2026-04-27T20:31:06.990117Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7540 elapsed=11.473505667s\n2026-04-27T20:31:07.027453Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7539 frame entries, coverage from 2026-04-26 17:30:55.515694 UTC\n2026-04-27T20:32:04.352887Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=338 elapsed=1.609685292s\n2026-04-27T20:32:04.544815Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=45 elapsed=9.06576025s\n2026-04-27T20:32:04.544911Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 45 eligible frames\n2026-04-27T20:32:05.793956Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:32:06.951226Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 5.2MB → 3.3MB (1.6x), 22 JPEGs deleted\n2026-04-27T20:32:08.751698Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.1MB → 0.7MB (4.4x), 21 JPEGs deleted\n2026-04-27T20:32:20.197912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2338985759867801519, trigger=click)\n2026-04-27T20:32:43.107353Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5366113786402399547, trigger=visual_change)\n2026-04-27T20:33:13.387330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7820901224464693596, trigger=visual_change)\n2026-04-27T20:33:36.962004Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-792722415084285626, trigger=visual_change)\n2026-04-27T20:33:52.788506Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-792722415084285626, trigger=visual_change)\n2026-04-27T20:34:03.058144Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1911463890682293842, trigger=click)\n2026-04-27T20:37:13.371019Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=338 elapsed=1.548607875s\n2026-04-27T20:37:18.754243Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=63 elapsed=9.994003083s\n2026-04-27T20:37:18.754867Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 63 eligible frames\n2026-04-27T20:37:20.546963Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 26 frames, 6.1MB → 0.4MB (15.6x), 26 JPEGs deleted\n2026-04-27T20:37:22.922351Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 35 frames, 5.0MB → 1.2MB (4.1x), 35 JPEGs deleted\n2026-04-27T20:37:59.040947Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2264186727250956418, trigger=click)\n2026-04-27T20:37:59.126830Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2264186727250956418, trigger=click)\n2026-04-27T20:42:17.212397Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:42:17.341748Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:42:19.883370Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:42:19.885313Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:42:19.885440Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:42:19.885759Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:42:19.885721Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:42:19.887502Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:42:19.887547Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:42:19.887575Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:42:19.887675Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:42:19.895545Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:42:20.017957Z INFO screenpipe_engine::ui_recorder: UI recording session ended: c94c9344-e31e-4db3-a794-faa7352ffc62\n2026-04-27T20:42:20.018036Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ sp-start\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-28T09:18:07.393496Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-28T09:18:07.485649Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-28T09:18:08.096899Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-28T09:18:08.098605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-28T09:18:08.099212Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-28T09:18:08.120116Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-28T09:18:08.120175Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-28T09:18:08.120506Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-28T09:18:08.120523Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-28T09:18:08.120420Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-28T09:18:08.120460Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-28T09:18:08.120614Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-28T09:18:08.123907Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-28T09:18:08.124199Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-28T09:18:08.124410Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-28T09:18:08.124775Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-28T09:18:08.124954Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-28T09:18:08.125124Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-28T09:18:08.125143Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-28T09:18:08.126925Z INFO screenpipe: starting UI event capture\n2026-04-28T09:18:08.126221Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-28T09:18:08.135268Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-28T09:18:08.135595Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-28T09:18:08.140897Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-28T09:18:08.156086Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-28T09:18:08.156200Z INFO screenpipe_engine::ui_recorder: UI recording session started: 60a77b54-af9c-413a-9c55-187edee69d5c\n2026-04-28T09:18:08.156460Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-27 06:18:08.156457 UTC to 2026-04-28 06:18:08.156457 UTC)\n2026-04-28T09:18:08.156988Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-28T09:18:08.167538Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-28T09:18:08.174773Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-28T09:18:08.562937Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-28T09:18:08.562975Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-28T09:18:08.563029Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-28T09:18:08.763313Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-28T09:18:08.763354Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-28T09:18:08.763372Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-28T09:18:08.763380Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-28T09:18:08.763440Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-28T09:18:10.336498Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)","is_focused":true},{"role":"AXTextField","text":"retention","depth":3,"bounds":{"left":0.7888889,"top":0.10555556,"width":0.13055556,"height":0.024444444},"automation_id":"_NS:65","value":"retention","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.7902778,"top":0.10555556,"width":0.017361112,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.9013889,"top":0.10555556,"width":0.015277778,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.925,"top":0.10666667,"width":0.014583333,"height":0.023333333},"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.93958336,"top":0.10666667,"width":0.014583333,"height":0.023333333},"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-95-134:~ (tail)","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.47083333,"top":0.033333335,"width":0.058333334,"height":0.017777778},"role_description":"text"}]...
|
105447694556091508
|
7288989431767872865
|
manual
|
accessibility
|
NULL
|
│ audio chunk duration │ 30 seconds │ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 7 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: https://github.com/screenpipe/screenpipe/releases
2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture
2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh
2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture
2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2
2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)
2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)
2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop s...
|
NULL
|
NULL
|
|
90526
|
2458
|
0
|
2026-04-28T06:18:09.276171+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-28/1777 /Users/lukas/.screenpipe/data/data/2026-04-28/1777357089276_m2.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
│ audio disabled │ true │ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 7 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: https://github.com/screenpipe/screenpipe/releases
2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture
2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh
2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture
2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2
2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)
2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)
2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)
2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on [IP_ADDRESS]:3030
2026-...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:27:23.708271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:27:23.857140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:27:24.535232Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:27:24.536622Z INFO screenpipe: stopping UI event capture\n\n2026-04-27T20:27:24.536751Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:27:24.536810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:27:24.536876Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:27:24.537910Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager \n2026-04-27T20:27:24.537937Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:27:24.538217Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:27:24.538354Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:27:24.550217Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:27:24.665575Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:27:24.665646Z INFO screenpipe: shutdown complete\nnpx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:27:40.109271Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:27:40.171419Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T20:27:40.783105Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:27:40.784956Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:27:40.785423Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:27:40.825160Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:27:40.825230Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:27:40.825425Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:27:40.825522Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:27:40.825535Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:27:40.825448Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:27:40.825589Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:27:40.839746Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:27:40.846623Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:27:40.846844Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:27:40.847335Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:27:40.847511Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:27:40.847677Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:27:40.848142Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:27:40.848156Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n2026-04-27T20:27:40.848964Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T20:27:40.852124Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:27:40.862411Z INFO screenpipe: starting UI event capture\n2026-04-27T20:27:40.878161Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:27:40.894556Z INFO screenpipe_engine::ui_recorder: UI recording session started: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:27:40.894598Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:27:40.894637Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:27:40.894634 UTC to 2026-04-27 17:27:40.894634 UTC)\n2026-04-27T20:27:40.895369Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:27:40.902580Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:27:40.910282Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:27:41.214017Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:27:41.214052Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.214116Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.381988Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:27:41.382022Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:27:41.382038Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:27:41.382045Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:27:41.382086Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:27:42.095403Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:27:42.253405Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:42.462118Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90191, dur=129ms\n2026-04-27T20:27:42.463860Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T20:27:42.693627Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90192, dur=77ms\n2026-04-27T20:27:51.381510Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:51.712562Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7532 elapsed=10.816977375s\n2026-04-27T20:27:51.737118Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7531 frame entries, coverage from 2026-04-26 17:27:40.894634 UTC\n2026-04-27T20:27:56.962882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:28:49.821781Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=51 elapsed=8.990252667s\n2026-04-27T20:28:49.821906Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 51 eligible frames\n2026-04-27T20:28:51.481884Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 8.0MB → 0.5MB (14.8x), 24 JPEGs deleted\n2026-04-27T20:28:53.051453Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.7MB → 0.3MB (18.4x), 25 JPEGs deleted\n^C2026-04-27T20:30:32.129537Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:30:32.130931Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:30:32.131010Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:30:32.131074Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:30:32.131039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:30:32.131133Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:30:32.131085Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:30:32.131290Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:30:32.131334Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:30:32.138634Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:30:32.286550Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:30:32.287619Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:30:54.735165Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:30:54.797709Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:30:55.472614Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:30:55.475859Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:30:55.475892Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:30:55.476036Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:30:55.476044Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:30:55.476057Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:30:55.476105Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:30:55.476106Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:30:55.476655Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:30:55.478599Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:30:55.478870Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:30:55.479291Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:30:55.479475Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:30:55.479705Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:30:55.480173Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:30:55.480195Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:30:55.482746Z INFO screenpipe: starting UI event capture\n2026-04-27T20:30:55.482271Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T20:30:55.489318Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:30:55.490977Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:30:55.499721Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:30:55.515391Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:30:55.515493Z INFO screenpipe_engine::ui_recorder: UI recording session started: c94c9344-e31e-4db3-a794-faa7352ffc62\n2026-04-27T20:30:55.515697Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:30:55.515694 UTC to 2026-04-27 17:30:55.515694 UTC)\n2026-04-27T20:30:55.516149Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:30:55.524148Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:30:55.530896Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:30:55.737812Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:30:55.737864Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.737908Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.869687Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:30:55.869717Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:30:55.869731Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:30:55.869750Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:30:56.694562Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:30:56.835897Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90241, dur=85ms\n2026-04-27T20:30:56.861755Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:30:57.038581Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90242, dur=125ms\n2026-04-27T20:31:06.990117Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7540 elapsed=11.473505667s\n2026-04-27T20:31:07.027453Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7539 frame entries, coverage from 2026-04-26 17:30:55.515694 UTC\n2026-04-27T20:32:04.352887Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=338 elapsed=1.609685292s\n2026-04-27T20:32:04.544815Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=45 elapsed=9.06576025s\n2026-04-27T20:32:04.544911Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 45 eligible frames\n2026-04-27T20:32:05.793956Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:32:06.951226Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 5.2MB → 3.3MB (1.6x), 22 JPEGs deleted\n2026-04-27T20:32:08.751698Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.1MB → 0.7MB (4.4x), 21 JPEGs deleted\n2026-04-27T20:32:20.197912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2338985759867801519, trigger=click)\n2026-04-27T20:32:43.107353Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5366113786402399547, trigger=visual_change)\n2026-04-27T20:33:13.387330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7820901224464693596, trigger=visual_change)\n2026-04-27T20:33:36.962004Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-792722415084285626, trigger=visual_change)\n2026-04-27T20:33:52.788506Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-792722415084285626, trigger=visual_change)\n2026-04-27T20:34:03.058144Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1911463890682293842, trigger=click)\n2026-04-27T20:37:13.371019Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=338 elapsed=1.548607875s\n2026-04-27T20:37:18.754243Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=63 elapsed=9.994003083s\n2026-04-27T20:37:18.754867Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 63 eligible frames\n2026-04-27T20:37:20.546963Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 26 frames, 6.1MB → 0.4MB (15.6x), 26 JPEGs deleted\n2026-04-27T20:37:22.922351Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 35 frames, 5.0MB → 1.2MB (4.1x), 35 JPEGs deleted\n2026-04-27T20:37:59.040947Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2264186727250956418, trigger=click)\n2026-04-27T20:37:59.126830Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2264186727250956418, trigger=click)\n2026-04-27T20:42:17.212397Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:42:17.341748Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:42:19.883370Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:42:19.885313Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:42:19.885440Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:42:19.885759Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:42:19.885721Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:42:19.887502Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:42:19.887547Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:42:19.887575Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:42:19.887675Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:42:19.895545Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:42:20.017957Z INFO screenpipe_engine::ui_recorder: UI recording session ended: c94c9344-e31e-4db3-a794-faa7352ffc62\n2026-04-27T20:42:20.018036Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ sp-start\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-28T09:18:07.393496Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-28T09:18:07.485649Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-28T09:18:08.096899Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-28T09:18:08.098605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-28T09:18:08.099212Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-28T09:18:08.120116Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-28T09:18:08.120175Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-28T09:18:08.120506Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-28T09:18:08.120523Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-28T09:18:08.120420Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-28T09:18:08.120460Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-28T09:18:08.120614Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-28T09:18:08.123907Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-28T09:18:08.124199Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-28T09:18:08.124410Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-28T09:18:08.124775Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-28T09:18:08.124954Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-28T09:18:08.125124Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-28T09:18:08.125143Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-28T09:18:08.126925Z INFO screenpipe: starting UI event capture\n2026-04-28T09:18:08.126221Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-28T09:18:08.135268Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-28T09:18:08.135595Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-28T09:18:08.140897Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-28T09:18:08.156086Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-28T09:18:08.156200Z INFO screenpipe_engine::ui_recorder: UI recording session started: 60a77b54-af9c-413a-9c55-187edee69d5c\n2026-04-28T09:18:08.156460Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-27 06:18:08.156457 UTC to 2026-04-28 06:18:08.156457 UTC)\n2026-04-28T09:18:08.156988Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-28T09:18:08.167538Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-28T09:18:08.174773Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-28T09:18:08.562937Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-28T09:18:08.562975Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-28T09:18:08.563029Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-28T09:18:08.763313Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-28T09:18:08.763354Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-28T09:18:08.763372Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-28T09:18:08.763380Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-28T09:18:08.763440Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-28T09:18:10.336498Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-28T09:18:10.560403Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90525, dur=124ms\n2026-04-28T09:18:10.681098Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)","depth":4,"value":"│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T19:56:31.116443Z INFO screenpipe: starting UI event capture\n2026-04-27T19:56:31.132351Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T19:56:31.148443Z INFO screenpipe_engine::ui_recorder: UI recording session started: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T19:56:31.148446Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T19:56:31.148683Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 16:56:31.148682 UTC to 2026-04-27 16:56:31.148682 UTC)\n2026-04-27T19:56:31.150061Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T19:56:31.155659Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T19:56:31.167196Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T19:56:31.392535Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T19:56:31.392567Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.392605Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T19:56:31.497534Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T19:56:31.497563Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T19:56:31.497574Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T19:56:31.497581Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T19:56:31.497584Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T19:56:32.293398Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T19:56:32.423910Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89860, dur=61ms\n2026-04-27T19:56:32.437443Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:32.584727Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89861, dur=92ms\n2026-04-27T19:56:32.587498Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T19:56:42.528676Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7608 elapsed=11.378733875s\n2026-04-27T19:56:42.547481Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7607 frame entries, coverage from 2026-04-26 16:56:31.148682 UTC\n2026-04-27T19:56:46.743751Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T19:56:49.309309Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.734990708s\n2026-04-27T19:57:33.919211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6013499476122112149, trigger=click)\n2026-04-27T19:57:39.389194Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=8.287829708s\n2026-04-27T19:57:39.389367Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-27T19:57:40.870065Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.1MB → 0.2MB (15.7x), 22 JPEGs deleted\n2026-04-27T19:57:42.367668Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 2.5MB → 0.2MB (16.0x), 22 JPEGs deleted\n2026-04-27T19:57:52.284311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5146368420680202716, trigger=click)\n2026-04-27T19:57:53.419312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7248803987641357087, trigger=click)\n2026-04-27T19:57:57.950812Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8520859881412555287, trigger=click)\n2026-04-27T19:57:58.827743Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6841343401169170239, trigger=click)\n2026-04-27T19:57:59.717252Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2840036556773641783, trigger=click)\n2026-04-27T19:58:00.278090Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5431513884161089176, trigger=click)\n2026-04-27T19:58:01.053435Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=722224525664448379, trigger=click)\n2026-04-27T19:58:01.892546Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7275156748786085996, trigger=click)\n2026-04-27T19:58:03.596250Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.203998083s\n2026-04-27T20:02:51.678823Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=44 elapsed=9.33525275s\n2026-04-27T20:02:51.681405Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 44 eligible frames\n2026-04-27T20:02:53.161848Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.7MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-27T20:02:54.529524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 2.7MB → 0.3MB (9.9x), 21 JPEGs deleted\n2026-04-27T20:08:03.638149Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.89896225s\n2026-04-27T20:08:03.716525Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=9.178867375s\n2026-04-27T20:08:03.716611Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-27T20:08:05.325889Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.7MB → 1.9MB (2.5x), 17 JPEGs deleted\n2026-04-27T20:08:06.218399Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.7MB → 0.2MB (7.0x), 13 JPEGs deleted\n^[[A^[[A^[[A^[[A^C2026-04-27T20:10:20.836918Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:10:20.838554Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:10:20.838629Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:10:20.838661Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:10:20.838673Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:10:20.839300Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:10:20.839315Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:10:20.839335Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:10:20.839894Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:10:20.850107Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429\n2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000clear \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:10:44.049467Z INFO screenpipe: starting UI event capture\n2026-04-27T20:10:44.055070Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:10:44.061188Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:10:44.065468Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:10:44.082517Z INFO screenpipe_engine::ui_recorder: UI recording session started: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:10:44.082647Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:10:44.082715Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:10:44.082714 UTC to 2026-04-27 17:10:44.082714 UTC)\n2026-04-27T20:10:44.088340Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:10:44.093305Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:10:44.098902Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:10:44.302428Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:10:44.302475Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.302517Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:10:44.426412Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:10:44.426439Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:10:44.426453Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:10:44.426463Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:10:45.190610Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:10:45.380072Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:10:45.412840Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=89949, dur=146ms\n2026-04-27T20:10:45.538358Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=89950, dur=102ms\n2026-04-27T20:10:53.661134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1330119800584171942, trigger=visual_change)\n2026-04-27T20:10:55.519478Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7577 elapsed=11.435012375s\n2026-04-27T20:10:55.543275Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7576 frame entries, coverage from 2026-04-26 17:10:44.082714 UTC\n2026-04-27T20:10:59.832146Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1180316765985721615, trigger=visual_change)\n2026-04-27T20:11:15.209053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-415691015310213007, trigger=visual_change)\n2026-04-27T20:11:17.954541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8228989623393556154, trigger=click)\n2026-04-27T20:11:18.040559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8228989623393556154, trigger=visual_change)\n2026-04-27T20:11:20.867376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3913612097442894799, trigger=visual_change)\n2026-04-27T20:11:52.889729Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=39 elapsed=8.842961166s\n2026-04-27T20:11:52.889847Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 39 eligible frames\n2026-04-27T20:11:54.396387Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.6MB → 0.5MB (11.2x), 19 JPEGs deleted\n2026-04-27T20:11:55.558469Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.4MB → 0.2MB (12.6x), 18 JPEGs deleted\n2026-04-27T20:12:05.925045Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=321 elapsed=1.025463333s\n2026-04-27T20:16:14.870347Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:15.010633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6820645126293150224, trigger=click)\n2026-04-27T20:16:59.206719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:16:59.304835Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6905235229337016497, trigger=click)\n2026-04-27T20:17:05.090390Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.5240755s\n2026-04-27T20:17:05.090479Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:17:05.109111Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.83773325s\n2026-04-27T20:17:05.964310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.9MB → 0.5MB (5.9x), 10 JPEGs deleted\n2026-04-27T20:17:06.945038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.3MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-27T20:17:17.698076Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:17.784619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4716851356769001093, trigger=click)\n2026-04-27T20:17:24.272185Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5631194314809668284, trigger=click)\n2026-04-27T20:17:56.443197Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n2026-04-27T20:17:56.585620Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=213047964262122575, trigger=click)\n2026-04-27T20:18:16.539897Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=213047964262122575, trigger=click)\n^C2026-04-27T20:18:25.756723Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:18:25.757598Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:18:25.757767Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:18:25.758071Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:18:25.758157Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:18:25.758879Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:18:25.758967Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:18:25.758994Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:18:25.759072Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:18:25.767137Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b\n2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete\n2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:18:42.268605Z INFO screenpipe: starting UI event capture\n2026-04-27T20:18:42.273317Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:18:42.275359Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:18:42.283636Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:18:42.298549Z INFO screenpipe_engine::ui_recorder: UI recording session started: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:18:42.298647Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:18:42.298643 UTC to 2026-04-27 17:18:42.298643 UTC)\n2026-04-27T20:18:42.298527Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:18:42.299236Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:18:42.305860Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:18:42.313228Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:18:42.590275Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:18:42.590304Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.590346Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:18:42.710480Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:18:42.710506Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:18:42.710518Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:18:42.710526Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:18:42.710567Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:18:43.503753Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:18:43.646783Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90083, dur=78ms\n2026-04-27T20:18:43.658228Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:18:43.817853Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90084, dur=119ms\n2026-04-27T20:18:52.712508Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7599 elapsed=10.413097917s\n2026-04-27T20:18:52.737492Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7598 frame entries, coverage from 2026-04-26 17:18:42.298643 UTC\n2026-04-27T20:19:07.074053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2084632906700557492, trigger=visual_change)\n2026-04-27T20:19:29.240019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5166057184097149818, trigger=click)\n^C2026-04-27T20:19:30.016009Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:19:30.016961Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:19:30.017108Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:19:30.017141Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:19:30.017207Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:19:30.017206Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:19:30.017603Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:19:30.017847Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n\n2026-04-27T20:19:30.025538Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e\n2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture\n2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)\n2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:20:09.956665Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:20:10.253066Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:20:10.253098Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.253135Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:20:10.413338Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:20:10.413373Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:20:10.413388Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:20:10.413395Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:20:11.164855Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:20:11.336671Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:20:11.587349Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90097, dur=161ms\n2026-04-27T20:20:11.774814Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90098, dur=94ms\n2026-04-27T20:20:21.801012Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7602 elapsed=11.865619041s\n2026-04-27T20:20:21.819343Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7601 frame entries, coverage from 2026-04-26 17:20:09.934513 UTC\n2026-04-27T20:20:31.826005Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:32.013311Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.725707Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:33.798821Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:20:44.198118Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:47.240992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:48.850844Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:48.923628Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:20:50.291766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:20:53.303181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:21:05.638280Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=visual_change)\n2026-04-27T20:21:18.787909Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=326 elapsed=1.464176125s\n2026-04-27T20:21:19.482178Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=9.583954875s\n2026-04-27T20:21:19.482304Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-27T20:21:20.603943Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 3.0MB → 1.2MB (2.5x), 11 JPEGs deleted\n2026-04-27T20:21:21.429858Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 1.2MB → 0.4MB (3.5x), 9 JPEGs deleted\n2026-04-27T20:21:31.826983Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:21:31.899218Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:22:35.156153Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=705365544285048489, trigger=click)\n2026-04-27T20:23:08.006938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8894766289325635442, trigger=visual_change)\n2026-04-27T20:24:38.754259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8409210909782779178, trigger=click)\n2026-04-27T20:24:38.884526Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8409210909782779178, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-27T20:25:09.940157Z INFO screenpipe_engine::server: api_usage_5min: 1 requests\n2026-04-27T20:26:15.780873Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:15.848529Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:16.956131Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.035527Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:17.978266Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.117219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.593912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:18.747488Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.232345Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.858213Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:19.946638Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.760007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:21.855747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:23.970778Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.045942Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.334656Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:24.474600Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:26:27.946810Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=83 elapsed=6.510649208s\n2026-04-27T20:26:27.947039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 83 eligible frames\n2026-04-27T20:26:30.716745Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 12.6MB → 3.0MB (4.1x), 41 JPEGs deleted\n2026-04-27T20:26:33.275391Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 7.0MB → 1.2MB (6.1x), 40 JPEGs deleted\n2026-04-27T20:26:51.503730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:26:51.586893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:27:23.708271Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:27:23.857140Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:27:24.535232Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:27:24.536622Z INFO screenpipe: stopping UI event capture\n\n2026-04-27T20:27:24.536751Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:27:24.536810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:27:24.536876Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:27:24.537910Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager \n2026-04-27T20:27:24.537937Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:27:24.538217Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:27:24.538354Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-27T20:27:24.550217Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:27:24.665575Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 88c754c2-d131-4fbf-a023-697b2dea0bc2\n2026-04-27T20:27:24.665646Z INFO screenpipe: shutdown complete\nnpx screenpipe@latest record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.289 record --disable-audio --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-27T20:27:40.109271Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:27:40.171419Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n\n update: screenpipe 0.3.299 available (you have 0.3.289)\n run: npx screenpipe@latest record\n\n2026-04-27T20:27:40.783105Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:27:40.784956Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:27:40.785423Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:27:40.825160Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-27T20:27:40.825230Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:27:40.825425Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:27:40.825522Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:27:40.825535Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:27:40.825448Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:27:40.825589Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:27:40.839746Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:27:40.846623Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:27:40.846844Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:27:40.847335Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:27:40.847511Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:27:40.847677Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:27:40.848142Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:27:40.848156Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n2026-04-27T20:27:40.848964Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n2026-04-27T20:27:40.852124Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:27:40.862411Z INFO screenpipe: starting UI event capture\n2026-04-27T20:27:40.878161Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:27:40.894556Z INFO screenpipe_engine::ui_recorder: UI recording session started: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:27:40.894598Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:27:40.894637Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:27:40.894634 UTC to 2026-04-27 17:27:40.894634 UTC)\n2026-04-27T20:27:40.895369Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:27:40.902580Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:27:40.910282Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:27:41.214017Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:27:41.214052Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.214116Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:27:41.381988Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:27:41.382022Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:27:41.382038Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-27T20:27:41.382045Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-27T20:27:41.382086Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:27:42.095403Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:27:42.253405Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:42.462118Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90191, dur=129ms\n2026-04-27T20:27:42.463860Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-27T20:27:42.693627Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90192, dur=77ms\n2026-04-27T20:27:51.381510Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:27:51.712562Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7532 elapsed=10.816977375s\n2026-04-27T20:27:51.737118Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7531 frame entries, coverage from 2026-04-26 17:27:40.894634 UTC\n2026-04-27T20:27:56.962882Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4572921365264801438, trigger=click)\n2026-04-27T20:28:49.821781Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=51 elapsed=8.990252667s\n2026-04-27T20:28:49.821906Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 51 eligible frames\n2026-04-27T20:28:51.481884Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 8.0MB → 0.5MB (14.8x), 24 JPEGs deleted\n2026-04-27T20:28:53.051453Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.7MB → 0.3MB (18.4x), 25 JPEGs deleted\n^C2026-04-27T20:30:32.129537Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:30:32.130931Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:30:32.131010Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:30:32.131074Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:30:32.131039Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:30:32.131133Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:30:32.131085Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:30:32.131290Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:30:32.131334Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:30:32.138634Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:30:32.286550Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 92951f5f-22f1-48d3-9399-961d6c87d797\n2026-04-27T20:30:32.287619Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows \"Boosteroid\" \ndetected hardware tier: Mid\n\n update: screenpipe 0.3.299 available (you have 0.3.280)\n run: npx screenpipe@latest record\n\n2026-04-27T20:30:54.735165Z INFO screenpipe_engine::cli: api auth enabled — key loaded\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-27T20:30:54.797709Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-27T20:30:55.472614Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-27T20:30:55.475859Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-27T20:30:55.475892Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-27T20:30:55.476036Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-27T20:30:55.476044Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-27T20:30:55.476057Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-27T20:30:55.476105Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-27T20:30:55.476106Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-27T20:30:55.476655Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-27T20:30:55.478599Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-27T20:30:55.478870Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-27T20:30:55.479291Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-27T20:30:55.479475Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-27T20:30:55.479705Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-27T20:30:55.480173Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-27T20:30:55.480195Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-27T20:30:55.482746Z INFO screenpipe: starting UI event capture\n2026-04-27T20:30:55.482271Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-27T20:30:55.489318Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-27T20:30:55.490977Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-27T20:30:55.499721Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-27T20:30:55.515391Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-27T20:30:55.515493Z INFO screenpipe_engine::ui_recorder: UI recording session started: c94c9344-e31e-4db3-a794-faa7352ffc62\n2026-04-27T20:30:55.515697Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:30:55.515694 UTC to 2026-04-27 17:30:55.515694 UTC)\n2026-04-27T20:30:55.516149Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-27T20:30:55.524148Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-27T20:30:55.530896Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-27T20:30:55.737812Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-27T20:30:55.737864Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.737908Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-27T20:30:55.869687Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-27T20:30:55.869717Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-27T20:30:55.869731Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-27T20:30:55.869750Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-27T20:30:56.694562Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-27T20:30:56.835897Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90241, dur=85ms\n2026-04-27T20:30:56.861755Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-27T20:30:57.038581Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=90242, dur=125ms\n2026-04-27T20:31:06.990117Z WARN sqlx::query: summary=\"SELECT f.id, f.timestamp, f.offset_index, …\" db.statement=\"\\n\\nSELECT\\n f.id,\\n f.timestamp,\\n f.offset_index,\\n COALESCE(\\n SUBSTR(f.full_text, 1, 200),\\n SUBSTR(f.accessibility_text, 1, 200),\\n (\\n SELECT\\n SUBSTR(ot.text, 1, 200)\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as text,\\n COALESCE(\\n f.app_name,\\n (\\n SELECT\\n ot.app_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as app_name,\\n COALESCE(\\n f.window_name,\\n (\\n SELECT\\n ot.window_name\\n FROM\\n ocr_text ot\\n WHERE\\n ot.frame_id = f.id\\n LIMIT\\n 1\\n )\\n ) as window_name,\\n COALESCE(vc.device_name, f.device_name) as screen_device,\\n COALESCE(vc.file_path, f.snapshot_path) as video_path,\\n COALESCE(vc.fps, 0.033) as chunk_fps,\\n f.browser_url,\\n f.machine_id\\nFROM\\n frames f\\n LEFT JOIN video_chunks vc ON f.video_chunk_id = vc.id\\nWHERE\\n f.timestamp >= ?1\\n AND f.timestamp <= ?2\\n AND COALESCE(vc.file_path, f.snapshot_path, '') NOT LIKE 'cloud://%'\\nORDER BY\\n f.timestamp DESC,\\n f.offset_index DESC\\nLIMIT\\n 10000\\n\" rows_affected=0 rows_returned=7540 elapsed=11.473505667s\n2026-04-27T20:31:07.027453Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 7539 frame entries, coverage from 2026-04-26 17:30:55.515694 UTC\n2026-04-27T20:32:04.352887Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=338 elapsed=1.609685292s\n2026-04-27T20:32:04.544815Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=45 elapsed=9.06576025s\n2026-04-27T20:32:04.544911Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 45 eligible frames\n2026-04-27T20:32:05.793956Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=visual_change)\n2026-04-27T20:32:06.951226Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 5.2MB → 3.3MB (1.6x), 22 JPEGs deleted\n2026-04-27T20:32:08.751698Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.1MB → 0.7MB (4.4x), 21 JPEGs deleted\n2026-04-27T20:32:20.197912Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2338985759867801519, trigger=click)\n2026-04-27T20:32:43.107353Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5366113786402399547, trigger=visual_change)\n2026-04-27T20:33:13.387330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7820901224464693596, trigger=visual_change)\n2026-04-27T20:33:36.962004Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-792722415084285626, trigger=visual_change)\n2026-04-27T20:33:52.788506Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-792722415084285626, trigger=visual_change)\n2026-04-27T20:34:03.058144Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1911463890682293842, trigger=click)\n2026-04-27T20:37:13.371019Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=338 elapsed=1.548607875s\n2026-04-27T20:37:18.754243Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=63 elapsed=9.994003083s\n2026-04-27T20:37:18.754867Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 63 eligible frames\n2026-04-27T20:37:20.546963Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 26 frames, 6.1MB → 0.4MB (15.6x), 26 JPEGs deleted\n2026-04-27T20:37:22.922351Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 35 frames, 5.0MB → 1.2MB (4.1x), 35 JPEGs deleted\n2026-04-27T20:37:59.040947Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2264186727250956418, trigger=click)\n2026-04-27T20:37:59.126830Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2264186727250956418, trigger=click)\n2026-04-27T20:42:17.212397Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3596382804963053315, trigger=click)\n2026-04-27T20:42:17.341748Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3596382804963053315, trigger=click)\n^C2026-04-27T20:42:19.883370Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-27T20:42:19.885313Z INFO screenpipe: stopping UI event capture\n2026-04-27T20:42:19.885440Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-04-27T20:42:19.885759Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-27T20:42:19.885721Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-04-27T20:42:19.887502Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-27T20:42:19.887547Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-27T20:42:19.887575Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-04-27T20:42:19.887675Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n\n2026-04-27T20:42:19.895545Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:42:20.017957Z INFO screenpipe_engine::ui_recorder: UI recording session ended: c94c9344-e31e-4db3-a794-faa7352ffc62\n2026-04-27T20:42:20.018036Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ sp-start\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-04-28T09:18:07.393496Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-28T09:18:07.485649Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-28T09:18:08.096899Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-28T09:18:08.098605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-28T09:18:08.099212Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-28T09:18:08.120116Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-04-28T09:18:08.120175Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-28T09:18:08.120506Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-04-28T09:18:08.120523Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-04-28T09:18:08.120420Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-28T09:18:08.120460Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-28T09:18:08.120614Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-28T09:18:08.123907Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-28T09:18:08.124199Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-28T09:18:08.124410Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-28T09:18:08.124775Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-28T09:18:08.124954Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-28T09:18:08.125124Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-28T09:18:08.125143Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-04-28T09:18:08.126925Z INFO screenpipe: starting UI event capture\n2026-04-28T09:18:08.126221Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-28T09:18:08.135268Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-28T09:18:08.135595Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-28T09:18:08.140897Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-28T09:18:08.156086Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-28T09:18:08.156200Z INFO screenpipe_engine::ui_recorder: UI recording session started: 60a77b54-af9c-413a-9c55-187edee69d5c\n2026-04-28T09:18:08.156460Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-27 06:18:08.156457 UTC to 2026-04-28 06:18:08.156457 UTC)\n2026-04-28T09:18:08.156988Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-28T09:18:08.167538Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-04-28T09:18:08.174773Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-28T09:18:08.562937Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-28T09:18:08.562975Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-28T09:18:08.563029Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-28T09:18:08.763313Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-04-28T09:18:08.763354Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-04-28T09:18:08.763372Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-04-28T09:18:08.763380Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-04-28T09:18:08.763440Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-04-28T09:18:10.336498Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-28T09:18:10.560403Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=90525, dur=124ms\n2026-04-28T09:18:10.681098Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)","is_focused":true},{"role":"AXTextField","text":"retention","depth":3,"bounds":{"left":0.64793885,"top":1.0,"width":0.0625,"height":-0.07581806},"automation_id":"_NS:65","value":"retention","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.64860374,"top":1.0,"width":0.00831117,"height":-0.07581806},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.7017952,"top":1.0,"width":0.00731383,"height":-0.07581806},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.7130984,"top":1.0,"width":0.006981383,"height":-0.07661617},"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.7200798,"top":1.0,"width":0.006981383,"height":-0.07661617},"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.3487367,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.35073137,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.42719415,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42918882,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.58410907,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.58610374,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-95-134:~ (tail)","depth":2,"bounds":{"left":0.6625665,"top":1.0,"width":0.078457445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.66456115,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.4956782,"top":1.0,"width":0.027925532,"height":-0.02394259},"role_description":"text"}]...
|
-3251985005529047206
|
7288989431767872865
|
manual
|
accessibility
|
NULL
|
│ audio disabled │ true │ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
2026-04-27T19:56:31.090648Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-27T19:56:31.095121Z WARN screenpipe: pi agent install failed: bun not found — install from [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:10:21.039216Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 0a802136-b604-437b-9384-45e145988429
2026-04-27T20:10:21.039566Z INFO screenpipe: shutdown complete clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@0.3.280 record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
2026-04-27T20:10:43.236196Z INFO screenpipe_engine::cli: api auth enabled — key loaded
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:10:43.301949Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
update: screenpipe 0.3.299 available (you have 0.3.280)
run: npx screenpipe@latest record
2026-04-27T20:10:44.036811Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:10:44.043861Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:10:44.043866Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:10:44.044025Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:10:44.044040Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:10:44.044046Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:10:44.044057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:10:44.044117Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:10:44.045102Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:10:44.045753Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:10:44.046002Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:10:44.046512Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:10:44.046676Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:10:44.046800Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:10:44.046952Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:10:44.046970Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
2026-04-27T20:10:44.048909Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:18:25.894107Z INFO screenpipe_engine::ui_recorder: UI recording session ended: b4627bca-bce0-44c1-b21e-d868b838f60b
2026-04-27T20:18:25.895111Z INFO screenpipe: shutdown complete
2026-04-27T20:18:25.895988Z INFO screenpipe_core::pipes: pipe scheduler exited (generation 2)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid"
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:18:41.527418Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:18:41.587648Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:18:42.241265Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:18:42.242605Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:18:42.242925Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:18:42.263542Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:18:42.263611Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:18:42.263814Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:18:42.263880Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:18:42.263894Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:18:42.263957Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:18:42.263798Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:18:42.265828Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:18:42.266008Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:18:42.266518Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:18:42.266693Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:18:42.266846Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:18:42.267365Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:18:42.267387Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
2026-04-27T20:18:42.268317Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 14 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ 2026-04-27T20:19:30.107229Z INFO screenpipe_engine::ui_recorder: UI recording session ended: d13ca531-1204-4867-a4dc-de28a915974e
2026-04-27T20:19:30.107391Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20372-ai-reports-promotion-pages) $ npx screenpipe@latest record --disable-audio --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-04-27T20:20:09.128775Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-04-27T20:20:09.193601Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-27T20:20:09.873158Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-27T20:20:09.874726Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-27T20:20:09.875227Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-27T20:20:09.895293Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-04-27T20:20:09.895366Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-27T20:20:09.895607Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-04-27T20:20:09.895621Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-04-27T20:20:09.895561Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-27T20:20:09.895696Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-27T20:20:09.895608Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-27T20:20:09.899292Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-27T20:20:09.899565Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-27T20:20:09.900075Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-27T20:20:09.900283Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-27T20:20:09.900474Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-27T20:20:09.900985Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-27T20:20:09.901004Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ true │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 7 │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
2026-04-27T20:20:09.902954Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ disabled │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: https://github.com/screenpipe/screenpipe/releases
2026-04-27T20:20:09.903219Z INFO screenpipe: starting UI event capture
2026-04-27T20:20:09.908183Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh
2026-04-27T20:20:09.909276Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-27T20:20:09.918589Z INFO screenpipe_engine::ui_recorder: Starting UI event capture
2026-04-27T20:20:09.934353Z INFO screenpipe_engine::ui_recorder: UI recording session started: 88c754c2-d131-4fbf-a023-697b2dea0bc2
2026-04-27T20:20:09.934530Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)
2026-04-27T20:20:09.934518Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-26 17:20:09.934513 UTC to 2026-04-27 17:20:09.934513 UTC)
2026-04-27T20:20:09.935287Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)
2026-04-27T20:20:09.941955Z INFO screenpipe_engine::server: Server listening on [IP_ADDRESS]:3030
2026-...
|
NULL
|
NULL
|
|
95058
|
NULL
|
0
|
2026-04-28T19:23:27.861098+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-28/1777 /Users/lukas/.screenpipe/data/data/2026-04-28/1777404207861_m2.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
/Users/lukas/.screenpipe/data/data/2026-04-28/1777 /Users/lukas/.screenpipe/data/data/2026-04-28/1777404207861_m2.jpg...
|
2026-04-28T16:07:03.361935Z INFO screenpipe_engin 2026-04-28T16:07:03.361935Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:04.884403Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:05.202177Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:07.123899Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:08.584617Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:09.975643Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:10.221917Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:11.235748Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:11.573033Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:12.720817Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:13.085300Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:13.983235Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:15.315623Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:15.679709Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:16.294399Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:17.469168Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:17.704892Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:18.327350Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:18.584089Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:19.383211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:19.697209Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:20.683739Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:22.590735Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:23.502612Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:23.740842Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:24.632559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:24.961958Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:25.589407Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:30.159089Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:30.378744Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:34.788508Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:35.112244Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:35.943249Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:36.843570Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:37.166993Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:38.233737Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:42.733209Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:42.962402Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:44.443847Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:44.753972Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:57.769188Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:07:58.113833Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-04-28T16:08:32.137779Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:08:34.603773Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:08:34.932275Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:08:36.780956Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=89 elapsed=11.844145s
2026-04-28T16:08:36.781045Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 89 eligible frames
2026-04-28T16:08:40.099262Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 43 frames, 16.5MB → 0.6MB (26.1x), 43 JPEGs deleted
2026-04-28T16:08:42.789812Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 44 frames, 7.7MB → 0.3MB (29.9x), 44 JPEGs deleted
2026-04-28T16:08:47.816306Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:08:48.080973Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:08:49.055512Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:09:14.695030Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:09:14.946613Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:11:42.049193Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:11:42.534314Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:11:52.738708Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:11:53.064036Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:11:59.869884Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:12:00.215936Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:12:06.911557Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5781189571662577813, trigger=click)
2026-04-28T16:12:07.093383Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5781189571662577813, trigger=click)
2026-04-28T16:12:20.806166Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:21.032640Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:23.043723Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:23.369330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:25.662585Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:26.285107Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:27.289159Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:30.909210Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:31.157616Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:34.265113Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:34.507077Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
tip: install a starter bundle of pipes:
screenpipe install https://screenpi.pe/start.json
2026-04-28T16:13:54.410986Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=81 elapsed=11.608799667s
2026-04-28T16:13:54.411842Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 81 eligible frames
2026-04-28T16:13:57.167507Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 15.7MB → 0.6MB (24.9x), 41 JPEGs deleted
2026-04-28T16:13:59.574102Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 6.6MB → 0.3MB (25.9x), 38 JPEGs deleted
2026-04-28T16:14:05.617758Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:14:30.003264Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4871134950740386536, trigger=click)
2026-04-28T16:14:30.266331Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4871134950740386536, trigger=click)
2026-04-28T16:14:36.255363Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=9092815945908542616, trigger=click)
2026-04-28T16:14:36.548566Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=9092815945908542616, trigger=click)
tip: sign in for higher AI quotas + cloud sync:
screenpipe login
2026-04-28T16:19:08.931864Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=178 elapsed=1.132447167s
2026-04-28T16:19:11.931756Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=76 elapsed=12.367092209s
2026-04-28T16:19:11.931987Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 76 eligible frames
2026-04-28T16:19:15.012481Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 37 frames, 14.2MB → 0.6MB (22.5x), 37 JPEGs deleted
2026-04-28T16:19:17.554472Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 37 frames, 6.5MB → 0.3MB (25.2x), 37 JPEGs deleted
tip: get the screenpipe desktop app for the full experience
https://screenpi.pe
2026-04-28T16:24:27.038545Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=178 elapsed=1.000578959s
2026-04-28T16:24:29.034280Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=46 elapsed=11.139412958s
2026-04-28T16:24:29.035034Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames
2026-04-28T16:24:30.963871Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 23 frames, 8.8MB → 0.6MB (14.0x), 23 JPEGs deleted
2026-04-28T16:24:32.350677Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.7MB → 0.3MB (14.4x), 21 JPEGs deleted
2026-04-28T16:26:09.542993Z INFO screenpipe_engine::sleep_monitor: Screen locked (CGSession safety-net poll)
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-04-28T16:29:43.556469Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=43 elapsed=11.198770125s
2026-04-28T16:29:43.556550Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 43 eligible frames
2026-04-28T16:29:44.986491Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 8.1MB → 0.6MB (12.8x), 21 JPEGs deleted
2026-04-28T16:29:46.268687Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 20 frames, 3.5MB → 0.3MB (13.8x), 20 JPEGs deleted
tip: install a starter bundle of pipes:
screenpipe install https://screenpi.pe/start.json
2026-04-28T16:34:57.128232Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=24 elapsed=10.763956s
2026-04-28T16:34:57.128230Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=178 elapsed=1.4624175s
2026-04-28T16:34:57.131408Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 24 eligible frames
2026-04-28T16:34:58.083167Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 4.2MB → 0.6MB (6.7x), 11 JPEGs deleted
2026-04-28T16:34:58.887644Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 1.9MB → 0.3MB (7.6x), 11 JPEGs deleted
tip: sign in for higher AI quotas + cloud sync:
screenpipe login
2026-04-28T16:40:09.584894Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=6 elapsed=10.685695125s
2026-04-28T16:40:09.587850Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 6 eligible frames
2026-04-28T16:40:10.068260Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 2 frames, 0.8MB → 0.6MB (1.3x), 2 JPEGs deleted
2026-04-28T16:40:10.414309Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 2 frames, 0.3MB → 0.2MB (1.6x), 2 JPEGs deleted
tip: get the screenpipe desktop app for the full experience
https://screenpi.pe
2026-04-28T16:45:21.393195Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=2 elapsed=10.966809042s
2026-04-28T16:45:21.393281Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 2 eligible frames
2026-04-28T16:46:56.332846Z INFO screenpipe_engine::sleep_monitor: Screen unlocked (CGSession safety-net poll)
2026-04-28T16:46:56.334007Z INFO screenpipe_engine::event_driven_capture: invalidating persistent streams after unlock/wake for monitor 2
2026-04-28T16:46:56.352112Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
2026-04-28T16:46:58.304757Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)
2026-04-28T16:46:58.565809Z WARN screenpipe_engine::event_driven_capture: skipping capture: lock screen app 'loginwindow' on monitor 1
2026-04-28T16:46:58.897766Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)
2026-04-28T16:46:59.184093Z WARN screenpipe_engine::event_driven_capture: skipping capture: lock screen app 'loginwindow' on monitor 2
2026-04-28T16:47:01.338502Z INFO screenpipe_engine::sleep_monitor: Screen unlocked (CGSession safety-net poll)
2026-04-28T16:47:01.390301Z INFO screenpipe_engine::event_driven_capture: invalidating persistent streams after unlock/wake for monitor 2
2026-04-28T16:47:02.630076Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
2026-04-28T16:47:05.728990Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)
2026-04-28T16:47:07.623977Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)
2026-04-28T16:47:28.943957Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=179 elapsed=2.634386708s
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-04-28T16:50:17.222019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6216647555668337619, trigger=click)
2026-04-28T16:50:35.797720Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=0 elapsed=14.383813625s
2026-04-28T16:51:42.581111Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7104241776089826277, trigger=click)
2026-04-28T16:51:44.019608Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7104241776089826277, trigger=click)
2026-04-28T16:53:08.025195Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6139761258158646866, trigger=click)
tip: install a starter bundle of pipes:
screenpipe install https://screenpi.pe/start.json
2026-04-28T16:53:53.588281Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3939156275097735830, trigger=click)
2026-04-28T16:55:49.235703Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=0 elapsed=12.968643708s
2026-04-28T16:57:04.416388Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8581538536659125863, trigger=click)
2026-04-28T16:57:12.492178Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8581538536659125863, trigger=click)
2026-04-28T16:57:12.841981Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8581538536659125863, trigger=click)
2026-04-28T16:57:14.415251Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8581538536659125863, trigger=visual_change)
2026-04-28T16:57:14.726963Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8581538536659125863, trigger=click)
2026-04-28T16:57:17.407196Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8581538536659125863, trigger=visual_change)
tip: sign in for higher AI quotas + cloud sync:
screenpipe login
2026-04-28T17:00:57.997500Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=196 elapsed=2.082627917s
2026-04-28T17:01:14.953984Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=37 elapsed=24.41720925s
2026-04-28T17:01:14.966099Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 37 eligible frames
2026-04-28T17:01:17.943398Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 3.3MB → 0.4MB (8.8x), 18 JPEGs deleted
2026-04-28T17:01:22.631343Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 2.9MB → 1.1MB (2.5x), 19 JPEGs deleted
2026-04-28T17:01:33.886858Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=197 elapsed=1.1513605s
2026-04-28T17:01:35.848522Z INFO screenpipe_engine::meeting_detector: meeting v2: Idle -> Confirming (app=Firefox, signals=2)
2026-04-28T17:01:41.903090Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=197 elapsed=1.052568042s
2026-04-28T17:01:45.412020Z INFO screenpipe_engine::meeting_detector: meeting v2: Confirming -> Active (app=Firefox, signals=2, browser=true)
2026-04-28T17:01:46.211477Z INFO screenpipe_engine::meeting_detector: meeting v2: meeting started (id=18, app=Firefox, title=None)
2026-04-28T17:02:53.351145Z WARN sqlx::query: summary="COMMIT" db.statement="" rows_affected=1 rows_returned=0 elapsed=1.195813541s
tip: get the screenpipe desktop app for the full experience
https://screenpi.pe
2026-04-28T17:04:32.492320Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)
2026-04-28T17:04:40.831992Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)
2026-04-28T17:05:19.749943Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=520550632255337786, trigger=visual_change)
2026-04-28T17:06:36.762718Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8913262551050344622, trigger=click)
2026-04-28T17:06:37.394423Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8913262551050344622, trigger=click)
2026-04-28T17:06:38.571150Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=78 elapsed=15.889136334s
2026-04-28T17:06:38.571330Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 78 eligible frames
2026-04-28T17:06:41.727150Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 36 frames, 8.7MB → 1.5MB (5.7x), 36 JPEGs deleted
2026-04-28T17:06:47.337599Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 6.3MB → 2.8MB (2.2x), 40 JPEGs deleted
2026-04-28T17:07:35.259124Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=203 elapsed=1.296070334s
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-04-28T17:11:54.187082Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=209 elapsed=1.028743583s
2026-04-28T17:11:57.308650Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8297064725994209049, trigger=visual_change)
2026-04-28T17:12:03.975962Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=97 elapsed=16.608343459s
2026-04-28T17:12:03.980035Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 97 eligible frames
2026-04-28T17:12:09.423715Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 8.8MB → 1.3MB (7.0x), 38 JPEGs deleted
2026-04-28T17:12:18.745568Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 57 frames, 9.2MB → 5.1MB (1.8x), 57 JPEGs deleted
2026-04-28T17:12:28.910725Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8297064725994209049, trigger=click)
2026-04-28T17:12:47.242180Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=210 elapsed=1.053630416s
2026-04-28T17:12:50.549067Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7463698365302281039, trigger=click)
tip: install a starter bundle of pipes:
screenpipe install https://screenpi.pe/start.json
2026-04-28T17:13:10.200772Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5154540507509216989, trigger=click)
2026-04-28T17:13:10.768365Z WARN sqlx::query: summary="PRAGMA wal_checkpoint(TRUNCATE)" db.statement="" rows_affected=0 rows_returned=1 elapsed=1.391680292s
2026-04-28T17:17:32.658004Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=212 elapsed=2.466153666s
2026-04-28T17:17:35.955873Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=app_switch, monitor=1) — DB pool may be saturated
2026-04-28T17:17:44.553826Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=64 elapsed=25.777843041s
2026-04-28T17:17:44.559382Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 64 eligible frames
2026-04-28T17:17:50.399756Z INFO screenpipe_engine::event_driven_capture: monitor 1 capture recovered after 1 consecutive errors
2026-04-28T17:17:50.799123Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 30 frames, 5.2MB → 2.2MB (2.4x), 30 JPEGs deleted
2026-04-28T17:18:01.010642Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 32 frames, 6.5MB → 2.9MB (2.3x), 32 JPEGs deleted
tip: sign in for higher AI quotas + cloud sync:
screenpipe login
2026-04-28T17:18:33.982766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7174140395946848829, trigger=click)
2026-04-28T17:18:59.164878Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3302386423956492591, trigger=click)
2026-04-28T17:19:41.104295Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3302386423956492591, trigger=visual_change)
2026-04-28T17:21:03.299035Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=1.689362708s
2026-04-28T17:21:52.490456Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4085796735682377830, trigger=visual_change)
2026-04-28T17:22:50.204657Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5154540507509216989, trigger=click)
tip: get the screenpipe desktop app for the full experience
https://screenpi.pe
2026-04-28T17:23:14.691712Z WARN sqlx::query: summary="PRAGMA wal_checkpoint(TRUNCATE)" db.statement="" rows_affected=0 rows_returned=1 elapsed=5.316957667s
2026-04-28T17:23:14.705751Z WARN screenpipe_db::db: wal checkpoint: busy (could not truncate), 358 pages in WAL
2026-04-28T17:23:14.732610Z WARN sqlx::query: summary="BEGIN IMMEDIATE" db.statement="" rows_affected=1 rows_returned=0 elapsed=2.276639s
2026-04-28T17:23:14.953280Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=2.135656625s
2026-04-28T17:23:17.000358Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=32621934252632853, trigger=click)
2026-04-28T17:23:18.870480Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=63 elapsed=17.872300875s
2026-04-28T17:23:18.870810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 63 eligible frames
2026-04-28T17:23:24.674735Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 4.4MB → 1.6MB (2.7x), 27 JPEGs deleted
2026-04-28T17:23:30.134096Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 34 frames, 6.0MB → 2.6MB (2.3x), 34 JPEGs deleted
2026-04-28T17:23:47.062619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)
2026-04-28T17:23:47.660094Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=visual_change)
2026-04-28T17:24:26.590876Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=visual_change)
2026-04-28T17:24:35.057777Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)
2026-04-28T17:24:36.251095Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=visual_change)
2026-04-28T17:24:39.405376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=visual_change)
2026-04-28T17:24:53.019411Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)
2026-04-28T17:25:14.348055Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=click)
2026-04-28T17:25:30.864453Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=click)
2026-04-28T17:25:31.625221Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)
2026-04-28T17:27:39.084601Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)
2026-04-28T17:27:46.115702Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-04-28T17:28:43.734362Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=1.59602225s
2026-04-28T17:28:52.344071Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=61 elapsed=22.19854525s
2026-04-28T17:28:52.344502Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 61 eligible frames
2026-04-28T17:29:01.211744Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 31 frames, 5.3MB → 1.9MB (2.7x), 31 JPEGs deleted
2026-04-28T17:29:11.576322Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 28 frames, 5.0MB → 3.2MB (1.6x), 28 JPEGs deleted
2026-04-28T17:30:06.736879Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8813990094162065370, trigger=visual_change)
2026-04-28T17:31:16.370446Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)
2026-04-28T17:31:17.489267Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)
2026-04-28T17:31:24.338365Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)
2026-04-28T17:31:49.223910Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)
2026-04-28T17:31:55.489490Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)
2026-04-28T17:31:57.951399Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=visual_change)
2026-04-28T17:31:58.927289Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)
2026-04-28T17:32:02.151996Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)
2026-04-28T17:32:02.752775Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)
2026-04-28T17:32:05.672044Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)
2026-04-28T17:32:10.766730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)
2026-04-28T17:32:11.767270Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)
2026-04-28T17:32:14.898520Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)
2026-04-28T17:32:30.033898Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)
2026-04-28T17:32:36.337641Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)
2026-04-28T17:32:42.601724Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)
2026-04-28T17:32:49.882686Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)
2026-04-28T17:32:52.871340Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)
tip: install a starter bundle of pipes:
screenpipe install https://screenpi.pe/start.json
2026-04-28T17:33:20.872909Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)
2026-04-28T17:34:33.267284Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=2.737059125s
2026-04-28T17:34:35.268208Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=50 elapsed=23.676462709s
2026-04-28T17:34:35.269171Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 50 eligible frames
2026-04-28T17:34:40.919221Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)
2026-04-28T17:34:43.456560Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 23 frames, 3.8MB → 1.3MB (2.9x), 23 JPEGs deleted
2026-04-28T17:34:49.828980Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.8MB → 1.5MB (3.2x), 25 JPEGs deleted
2026-04-28T17:34:51.319224Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)
2026-04-28T17:37:53.608170Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=1.446908208s
tip: sign in for higher AI quotas + cloud sync:
screenpipe login
2026-04-28T17:38:38.976168Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-844953656408637404, trigger=visual_change)
2026-04-28T17:38:45.388397Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-844953656408637404, trigger=visual_change)
2026-04-28T17:38:54.425051Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7805582611831809135, trigger=visual_change)
2026-04-28T17:40:08.683806Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=53 elapsed=18.758745375s
2026-04-28T17:40:08.684515Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 53 eligible frames
2026-04-28T17:40:08.720339Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=1.41316125s
2026-04-28T17:40:14.527057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 4.4MB → 1.8MB (2.5x), 27 JPEGs deleted
2026-04-28T17:40:19.017809Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 5.0MB → 1.7MB (3.0x), 24 JPEGs deleted
2026-04-28T17:40:45.760291Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-1920675205105101407, trigger=click)
tip: get the screenpipe desktop app for the full experience
https://screenpi.pe
2026-04-28T17:44:44.523433Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6005834167210030885, trigger=click)
2026-04-28T17:45:36.046790Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=2.354551584s
2026-04-28T17:45:48.797258Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=35 elapsed=29.080941084s
2026-04-28T17:45:48.797852Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 35 eligible frames
2026-04-28T17:45:52.808293Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 2.8MB → 1.1MB (2.6x), 17 JPEGs deleted
2026-04-28T17:45:56.267588Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 16 frames, 2.9MB → 0.9MB (3.2x), 16 JPEGs deleted
2026-04-28T17:45:59.734072Z WARN sqlx::query: summary="BEGIN IMMEDIATE" db.statement="" rows_affected=1 rows_returned=0 elapsed=2.43974075s
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-04-28T17:48:11.307977Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-310266387443272529, trigger=click)
2026-04-28T17:50:06.399275Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=215 elapsed=1.493682625s
2026-04-28T17:51:22.688798Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=43 elapsed=26.391488834s
2026-04-28T17:51:22.690714Z INFO screenpipe_engine::snapshot_compaction: snapshot co...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"2026-04-28T16:07:03.361935Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:04.884403Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:05.202177Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:07.123899Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:08.584617Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:09.975643Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:10.221917Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:11.235748Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:11.573033Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:12.720817Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:13.085300Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:13.983235Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:15.315623Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:15.679709Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:16.294399Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:17.469168Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:17.704892Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:18.327350Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:18.584089Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:19.383211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:19.697209Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:20.683739Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:22.590735Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:23.502612Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:23.740842Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:24.632559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:24.961958Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:25.589407Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:30.159089Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:30.378744Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:34.788508Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:35.112244Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:35.943249Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:36.843570Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:37.166993Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:38.233737Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:42.733209Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:42.962402Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:44.443847Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:44.753972Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:57.769188Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:07:58.113833Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T16:08:32.137779Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:08:34.603773Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:08:34.932275Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:08:36.780956Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=89 elapsed=11.844145s\n2026-04-28T16:08:36.781045Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 89 eligible frames\n2026-04-28T16:08:40.099262Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 43 frames, 16.5MB → 0.6MB (26.1x), 43 JPEGs deleted\n2026-04-28T16:08:42.789812Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 44 frames, 7.7MB → 0.3MB (29.9x), 44 JPEGs deleted\n2026-04-28T16:08:47.816306Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:08:48.080973Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:08:49.055512Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:09:14.695030Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:09:14.946613Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:11:42.049193Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:11:42.534314Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:11:52.738708Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:11:53.064036Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:11:59.869884Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:12:00.215936Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:12:06.911557Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5781189571662577813, trigger=click)\n2026-04-28T16:12:07.093383Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5781189571662577813, trigger=click)\n2026-04-28T16:12:20.806166Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:21.032640Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:23.043723Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:23.369330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:25.662585Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:26.285107Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:27.289159Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:30.909210Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:31.157616Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:34.265113Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:34.507077Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T16:13:54.410986Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=81 elapsed=11.608799667s\n2026-04-28T16:13:54.411842Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 81 eligible frames\n2026-04-28T16:13:57.167507Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 15.7MB → 0.6MB (24.9x), 41 JPEGs deleted\n2026-04-28T16:13:59.574102Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 6.6MB → 0.3MB (25.9x), 38 JPEGs deleted\n2026-04-28T16:14:05.617758Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:14:30.003264Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4871134950740386536, trigger=click)\n2026-04-28T16:14:30.266331Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4871134950740386536, trigger=click)\n2026-04-28T16:14:36.255363Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=9092815945908542616, trigger=click)\n2026-04-28T16:14:36.548566Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=9092815945908542616, trigger=click)\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T16:19:08.931864Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=178 elapsed=1.132447167s\n2026-04-28T16:19:11.931756Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=76 elapsed=12.367092209s\n2026-04-28T16:19:11.931987Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 76 eligible frames\n2026-04-28T16:19:15.012481Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 37 frames, 14.2MB → 0.6MB (22.5x), 37 JPEGs deleted\n2026-04-28T16:19:17.554472Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 37 frames, 6.5MB → 0.3MB (25.2x), 37 JPEGs deleted\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T16:24:27.038545Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=178 elapsed=1.000578959s\n2026-04-28T16:24:29.034280Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=11.139412958s\n2026-04-28T16:24:29.035034Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-28T16:24:30.963871Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 23 frames, 8.8MB → 0.6MB (14.0x), 23 JPEGs deleted\n2026-04-28T16:24:32.350677Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.7MB → 0.3MB (14.4x), 21 JPEGs deleted\n2026-04-28T16:26:09.542993Z INFO screenpipe_engine::sleep_monitor: Screen locked (CGSession safety-net poll)\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T16:29:43.556469Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=43 elapsed=11.198770125s\n2026-04-28T16:29:43.556550Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 43 eligible frames\n2026-04-28T16:29:44.986491Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 8.1MB → 0.6MB (12.8x), 21 JPEGs deleted\n2026-04-28T16:29:46.268687Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 20 frames, 3.5MB → 0.3MB (13.8x), 20 JPEGs deleted\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T16:34:57.128232Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=24 elapsed=10.763956s\n2026-04-28T16:34:57.128230Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=178 elapsed=1.4624175s\n2026-04-28T16:34:57.131408Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 24 eligible frames\n2026-04-28T16:34:58.083167Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 4.2MB → 0.6MB (6.7x), 11 JPEGs deleted\n2026-04-28T16:34:58.887644Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 1.9MB → 0.3MB (7.6x), 11 JPEGs deleted\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T16:40:09.584894Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=6 elapsed=10.685695125s\n2026-04-28T16:40:09.587850Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 6 eligible frames\n2026-04-28T16:40:10.068260Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 2 frames, 0.8MB → 0.6MB (1.3x), 2 JPEGs deleted\n2026-04-28T16:40:10.414309Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 2 frames, 0.3MB → 0.2MB (1.6x), 2 JPEGs deleted\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T16:45:21.393195Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=2 elapsed=10.966809042s\n2026-04-28T16:45:21.393281Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 2 eligible frames\n2026-04-28T16:46:56.332846Z INFO screenpipe_engine::sleep_monitor: Screen unlocked (CGSession safety-net poll)\n2026-04-28T16:46:56.334007Z INFO screenpipe_engine::event_driven_capture: invalidating persistent streams after unlock/wake for monitor 2\n2026-04-28T16:46:56.352112Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\n2026-04-28T16:46:58.304757Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-28T16:46:58.565809Z WARN screenpipe_engine::event_driven_capture: skipping capture: lock screen app 'loginwindow' on monitor 1\n2026-04-28T16:46:58.897766Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-28T16:46:59.184093Z WARN screenpipe_engine::event_driven_capture: skipping capture: lock screen app 'loginwindow' on monitor 2\n2026-04-28T16:47:01.338502Z INFO screenpipe_engine::sleep_monitor: Screen unlocked (CGSession safety-net poll)\n2026-04-28T16:47:01.390301Z INFO screenpipe_engine::event_driven_capture: invalidating persistent streams after unlock/wake for monitor 2\n2026-04-28T16:47:02.630076Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\n2026-04-28T16:47:05.728990Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-28T16:47:07.623977Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-28T16:47:28.943957Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=179 elapsed=2.634386708s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T16:50:17.222019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6216647555668337619, trigger=click)\n2026-04-28T16:50:35.797720Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=14.383813625s\n2026-04-28T16:51:42.581111Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7104241776089826277, trigger=click)\n2026-04-28T16:51:44.019608Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7104241776089826277, trigger=click)\n2026-04-28T16:53:08.025195Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6139761258158646866, trigger=click)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T16:53:53.588281Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3939156275097735830, trigger=click)\n2026-04-28T16:55:49.235703Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.968643708s\n2026-04-28T16:57:04.416388Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8581538536659125863, trigger=click)\n2026-04-28T16:57:12.492178Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8581538536659125863, trigger=click)\n2026-04-28T16:57:12.841981Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8581538536659125863, trigger=click)\n2026-04-28T16:57:14.415251Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8581538536659125863, trigger=visual_change)\n2026-04-28T16:57:14.726963Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8581538536659125863, trigger=click)\n2026-04-28T16:57:17.407196Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8581538536659125863, trigger=visual_change)\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T17:00:57.997500Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=196 elapsed=2.082627917s\n2026-04-28T17:01:14.953984Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=37 elapsed=24.41720925s\n2026-04-28T17:01:14.966099Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 37 eligible frames\n2026-04-28T17:01:17.943398Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 3.3MB → 0.4MB (8.8x), 18 JPEGs deleted\n2026-04-28T17:01:22.631343Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 2.9MB → 1.1MB (2.5x), 19 JPEGs deleted\n2026-04-28T17:01:33.886858Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=197 elapsed=1.1513605s\n2026-04-28T17:01:35.848522Z INFO screenpipe_engine::meeting_detector: meeting v2: Idle -> Confirming (app=Firefox, signals=2)\n2026-04-28T17:01:41.903090Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=197 elapsed=1.052568042s\n2026-04-28T17:01:45.412020Z INFO screenpipe_engine::meeting_detector: meeting v2: Confirming -> Active (app=Firefox, signals=2, browser=true)\n2026-04-28T17:01:46.211477Z INFO screenpipe_engine::meeting_detector: meeting v2: meeting started (id=18, app=Firefox, title=None)\n2026-04-28T17:02:53.351145Z WARN sqlx::query: summary=\"COMMIT\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=1.195813541s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T17:04:32.492320Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T17:04:40.831992Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)\n2026-04-28T17:05:19.749943Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=520550632255337786, trigger=visual_change)\n2026-04-28T17:06:36.762718Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8913262551050344622, trigger=click)\n2026-04-28T17:06:37.394423Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8913262551050344622, trigger=click)\n2026-04-28T17:06:38.571150Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=78 elapsed=15.889136334s\n2026-04-28T17:06:38.571330Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 78 eligible frames\n2026-04-28T17:06:41.727150Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 36 frames, 8.7MB → 1.5MB (5.7x), 36 JPEGs deleted\n2026-04-28T17:06:47.337599Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 6.3MB → 2.8MB (2.2x), 40 JPEGs deleted\n2026-04-28T17:07:35.259124Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=203 elapsed=1.296070334s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T17:11:54.187082Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=209 elapsed=1.028743583s\n2026-04-28T17:11:57.308650Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8297064725994209049, trigger=visual_change)\n2026-04-28T17:12:03.975962Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=97 elapsed=16.608343459s\n2026-04-28T17:12:03.980035Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 97 eligible frames\n2026-04-28T17:12:09.423715Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 8.8MB → 1.3MB (7.0x), 38 JPEGs deleted\n2026-04-28T17:12:18.745568Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 57 frames, 9.2MB → 5.1MB (1.8x), 57 JPEGs deleted\n2026-04-28T17:12:28.910725Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8297064725994209049, trigger=click)\n2026-04-28T17:12:47.242180Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=210 elapsed=1.053630416s\n2026-04-28T17:12:50.549067Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7463698365302281039, trigger=click)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T17:13:10.200772Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5154540507509216989, trigger=click)\n2026-04-28T17:13:10.768365Z WARN sqlx::query: summary=\"PRAGMA wal_checkpoint(TRUNCATE)\" db.statement=\"\" rows_affected=0 rows_returned=1 elapsed=1.391680292s\n2026-04-28T17:17:32.658004Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=212 elapsed=2.466153666s\n2026-04-28T17:17:35.955873Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=app_switch, monitor=1) — DB pool may be saturated\n2026-04-28T17:17:44.553826Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=64 elapsed=25.777843041s\n2026-04-28T17:17:44.559382Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 64 eligible frames\n2026-04-28T17:17:50.399756Z INFO screenpipe_engine::event_driven_capture: monitor 1 capture recovered after 1 consecutive errors\n2026-04-28T17:17:50.799123Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 30 frames, 5.2MB → 2.2MB (2.4x), 30 JPEGs deleted\n2026-04-28T17:18:01.010642Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 32 frames, 6.5MB → 2.9MB (2.3x), 32 JPEGs deleted\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T17:18:33.982766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7174140395946848829, trigger=click)\n2026-04-28T17:18:59.164878Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3302386423956492591, trigger=click)\n2026-04-28T17:19:41.104295Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3302386423956492591, trigger=visual_change)\n2026-04-28T17:21:03.299035Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=1.689362708s\n2026-04-28T17:21:52.490456Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4085796735682377830, trigger=visual_change)\n2026-04-28T17:22:50.204657Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5154540507509216989, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T17:23:14.691712Z WARN sqlx::query: summary=\"PRAGMA wal_checkpoint(TRUNCATE)\" db.statement=\"\" rows_affected=0 rows_returned=1 elapsed=5.316957667s\n2026-04-28T17:23:14.705751Z WARN screenpipe_db::db: wal checkpoint: busy (could not truncate), 358 pages in WAL\n2026-04-28T17:23:14.732610Z WARN sqlx::query: summary=\"BEGIN IMMEDIATE\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=2.276639s\n2026-04-28T17:23:14.953280Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=2.135656625s\n2026-04-28T17:23:17.000358Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=32621934252632853, trigger=click)\n2026-04-28T17:23:18.870480Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=63 elapsed=17.872300875s\n2026-04-28T17:23:18.870810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 63 eligible frames\n2026-04-28T17:23:24.674735Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 4.4MB → 1.6MB (2.7x), 27 JPEGs deleted\n2026-04-28T17:23:30.134096Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 34 frames, 6.0MB → 2.6MB (2.3x), 34 JPEGs deleted\n2026-04-28T17:23:47.062619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)\n2026-04-28T17:23:47.660094Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=visual_change)\n2026-04-28T17:24:26.590876Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=visual_change)\n2026-04-28T17:24:35.057777Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)\n2026-04-28T17:24:36.251095Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=visual_change)\n2026-04-28T17:24:39.405376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=visual_change)\n2026-04-28T17:24:53.019411Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)\n2026-04-28T17:25:14.348055Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=click)\n2026-04-28T17:25:30.864453Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=click)\n2026-04-28T17:25:31.625221Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)\n2026-04-28T17:27:39.084601Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T17:27:46.115702Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T17:28:43.734362Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=1.59602225s\n2026-04-28T17:28:52.344071Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=61 elapsed=22.19854525s\n2026-04-28T17:28:52.344502Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 61 eligible frames\n2026-04-28T17:29:01.211744Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 31 frames, 5.3MB → 1.9MB (2.7x), 31 JPEGs deleted\n2026-04-28T17:29:11.576322Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 28 frames, 5.0MB → 3.2MB (1.6x), 28 JPEGs deleted\n2026-04-28T17:30:06.736879Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8813990094162065370, trigger=visual_change)\n2026-04-28T17:31:16.370446Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:31:17.489267Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:31:24.338365Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)\n2026-04-28T17:31:49.223910Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)\n2026-04-28T17:31:55.489490Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)\n2026-04-28T17:31:57.951399Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=visual_change)\n2026-04-28T17:31:58.927289Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:32:02.151996Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:32:02.752775Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:32:05.672044Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:32:10.766730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:32:11.767270Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:32:14.898520Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)\n2026-04-28T17:32:30.033898Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)\n2026-04-28T17:32:36.337641Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)\n2026-04-28T17:32:42.601724Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)\n2026-04-28T17:32:49.882686Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)\n2026-04-28T17:32:52.871340Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T17:33:20.872909Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)\n2026-04-28T17:34:33.267284Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=2.737059125s\n2026-04-28T17:34:35.268208Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=50 elapsed=23.676462709s\n2026-04-28T17:34:35.269171Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 50 eligible frames\n2026-04-28T17:34:40.919221Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T17:34:43.456560Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 23 frames, 3.8MB → 1.3MB (2.9x), 23 JPEGs deleted\n2026-04-28T17:34:49.828980Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.8MB → 1.5MB (3.2x), 25 JPEGs deleted\n2026-04-28T17:34:51.319224Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)\n2026-04-28T17:37:53.608170Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=1.446908208s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T17:38:38.976168Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-844953656408637404, trigger=visual_change)\n2026-04-28T17:38:45.388397Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-844953656408637404, trigger=visual_change)\n2026-04-28T17:38:54.425051Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7805582611831809135, trigger=visual_change)\n2026-04-28T17:40:08.683806Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=53 elapsed=18.758745375s\n2026-04-28T17:40:08.684515Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 53 eligible frames\n2026-04-28T17:40:08.720339Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=1.41316125s\n2026-04-28T17:40:14.527057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 4.4MB → 1.8MB (2.5x), 27 JPEGs deleted\n2026-04-28T17:40:19.017809Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 5.0MB → 1.7MB (3.0x), 24 JPEGs deleted\n2026-04-28T17:40:45.760291Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-1920675205105101407, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T17:44:44.523433Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6005834167210030885, trigger=click)\n2026-04-28T17:45:36.046790Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=2.354551584s\n2026-04-28T17:45:48.797258Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=35 elapsed=29.080941084s\n2026-04-28T17:45:48.797852Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 35 eligible frames\n2026-04-28T17:45:52.808293Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 2.8MB → 1.1MB (2.6x), 17 JPEGs deleted\n2026-04-28T17:45:56.267588Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 16 frames, 2.9MB → 0.9MB (3.2x), 16 JPEGs deleted\n2026-04-28T17:45:59.734072Z WARN sqlx::query: summary=\"BEGIN IMMEDIATE\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=2.43974075s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T17:48:11.307977Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-310266387443272529, trigger=click)\n2026-04-28T17:50:06.399275Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=215 elapsed=1.493682625s\n2026-04-28T17:51:22.688798Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=43 elapsed=26.391488834s\n2026-04-28T17:51:22.690714Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 43 eligible frames\n2026-04-28T17:51:29.036691Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.6MB → 1.4MB (2.7x), 22 JPEGs deleted\n2026-04-28T17:51:32.222940Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 2.7MB → 0.4MB (6.6x), 19 JPEGs deleted\n2026-04-28T17:52:04.754173Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3769295062857853594, trigger=click)\n2026-04-28T17:52:13.489892Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3769295062857853594, trigger=visual_change)\n2026-04-28T17:52:15.091164Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3769295062857853594, trigger=click)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T17:53:48.873572Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6254911494541167184, trigger=click)\n2026-04-28T17:56:43.964294Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=216 elapsed=1.621008083s\n2026-04-28T17:56:53.860942Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=43 elapsed=21.317519709s\n2026-04-28T17:56:53.861419Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 43 eligible frames\n2026-04-28T17:56:58.615624Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 23 frames, 3.5MB → 1.3MB (2.6x), 23 JPEGs deleted\n2026-04-28T17:57:02.978805Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.7MB → 0.8MB (3.2x), 18 JPEGs deleted\n2026-04-28T17:57:26.396309Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T17:57:32.405615Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T18:01:25.451495Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T18:01:26.059212Z WARN sqlx::query: summary=\"COMMIT\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=2.378852666s\n2026-04-28T18:01:32.813958Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)\n2026-04-28T18:02:22.865372Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=59 elapsed=19.861929375s\n2026-04-28T18:02:22.868572Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 59 eligible frames\n2026-04-28T18:02:28.010325Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 4.4MB → 1.6MB (2.7x), 27 JPEGs deleted\n2026-04-28T18:02:31.034840Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T18:02:35.341581Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 30 frames, 5.4MB → 2.2MB (2.4x), 30 JPEGs deleted\n2026-04-28T18:02:52.414456Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T18:03:22.286014Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T18:06:38.897268Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=225 elapsed=1.272339875s\n2026-04-28T18:06:56.830727Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3059468017859355985, trigger=visual_change)\n2026-04-28T18:07:46.547699Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=226 elapsed=1.289059583s\n2026-04-28T18:07:49.469402Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=73 elapsed=13.809847041s\n2026-04-28T18:07:49.469802Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 73 eligible frames\n2026-04-28T18:07:54.084967Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 36 frames, 6.2MB → 2.3MB (2.7x), 36 JPEGs deleted\n2026-04-28T18:07:58.202315Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 35 frames, 6.5MB → 3.1MB (2.1x), 35 JPEGs deleted\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T18:08:30.182501Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Idle (timeout=300s, app=Firefox, id=18)\n2026-04-28T18:08:31.026260Z INFO screenpipe_engine::meeting_detector: meeting v2: meeting ended (id=18)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T18:13:12.197365Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=57 elapsed=13.981802916s\n2026-04-28T18:13:12.201813Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 57 eligible frames\n2026-04-28T18:13:12.369500Z WARN sqlx::query: summary=\"PRAGMA wal_checkpoint(TRUNCATE)\" db.statement=\"\" rows_affected=0 rows_returned=1 elapsed=2.777140458s\n2026-04-28T18:13:16.080941Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 3.8MB → 1.2MB (3.1x), 24 JPEGs deleted\n2026-04-28T18:13:22.515083Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 31 frames, 5.2MB → 2.0MB (2.6x), 31 JPEGs deleted\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T18:18:45.389294Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=72 elapsed=22.856535958s\n2026-04-28T18:18:45.394002Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 72 eligible frames\n2026-04-28T18:18:45.477022Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=245 elapsed=1.363011375s\n2026-04-28T18:18:52.269655Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 32 frames, 7.9MB → 1.3MB (5.9x), 32 JPEGs deleted\n2026-04-28T18:19:00.406515Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 6.1MB → 2.3MB (2.6x), 38 JPEGs deleted\n2026-04-28T18:21:03.916795Z WARN sqlx::query: summary=\"BEGIN IMMEDIATE\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=1.642808625s\n2026-04-28T18:21:31.158779Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=245 elapsed=1.711686125s\n2026-04-28T18:22:12.801109Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8839231840523050937, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T18:24:16.556243Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=78 elapsed=16.13078575s\n2026-04-28T18:24:16.559056Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 78 eligible frames\n2026-04-28T18:24:16.596020Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=246 elapsed=1.752819416s\n2026-04-28T18:24:21.049775Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 31 frames, 8.1MB → 0.4MB (18.8x), 31 JPEGs deleted\n2026-04-28T18:24:35.718459Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 45 frames, 7.3MB → 2.7MB (2.7x), 45 JPEGs deleted\n2026-04-28T18:27:46.371199Z WARN sqlx::query: summary=\"BEGIN IMMEDIATE\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=1.099897791s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T18:29:48.752521Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=255 elapsed=2.115721292s\n2026-04-28T18:29:51.054020Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=70 elapsed=15.212678792s\n2026-04-28T18:29:51.054164Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 70 eligible frames\n2026-04-28T18:29:53.661408Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 30 frames, 7.9MB → 0.5MB (14.5x), 30 JPEGs deleted\n2026-04-28T18:29:59.515910Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 6.1MB → 2.6MB (2.3x), 38 JPEGs deleted\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T18:35:11.275137Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=257 elapsed=1.890251791s\n2026-04-28T18:35:13.565990Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=58 elapsed=14.023576042s\n2026-04-28T18:35:13.566708Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 58 eligible frames\n2026-04-28T18:35:15.986131Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 6.3MB → 0.4MB (14.8x), 24 JPEGs deleted\n2026-04-28T18:35:21.127038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 32 frames, 4.8MB → 2.0MB (2.4x), 32 JPEGs deleted\n2026-04-28T18:36:21.444171Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=257 elapsed=1.478779s\n2026-04-28T18:36:54.736632Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7349402793474718158, trigger=visual_change)\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T18:38:24.648333Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7138146743394558203, trigger=click)\n2026-04-28T18:40:30.102499Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=264 elapsed=2.280901875s\n2026-04-28T18:40:41.876243Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=55 elapsed=20.714885166s\n2026-04-28T18:40:41.877272Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 55 eligible frames\n2026-04-28T18:40:43.565653Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 20 frames, 5.2MB → 0.4MB (12.4x), 20 JPEGs deleted\n2026-04-28T18:40:47.405111Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 33 frames, 5.0MB → 2.2MB (2.2x), 33 JPEGs deleted\n2026-04-28T18:40:55.281930Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=264 elapsed=2.497021667s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T18:45:57.736770Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=269 elapsed=1.472064125s\n2026-04-28T18:46:02.552257Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=36 elapsed=15.12999075s\n2026-04-28T18:46:02.552440Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 36 eligible frames\n2026-04-28T18:46:03.937817Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 3.4MB → 0.4MB (8.2x), 13 JPEGs deleted\n2026-04-28T18:46:06.882225Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.2MB → 1.5MB (2.2x), 21 JPEGs deleted\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T18:48:36.805777Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5539694277092651559, trigger=visual_change)\n2026-04-28T18:49:57.584913Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5539694277092651559, trigger=visual_change)\n2026-04-28T18:50:04.730346Z WARN sqlx::query: summary=\"BEGIN IMMEDIATE\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=1.905377875s\n2026-04-28T18:50:43.113582Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=271 elapsed=1.116028833s\n2026-04-28T18:51:29.107031Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=53 elapsed=20.394365583s\n2026-04-28T18:51:29.107446Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 53 eligible frames\n2026-04-28T18:51:35.119217Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 4.7MB → 0.4MB (11.2x), 18 JPEGs deleted\n2026-04-28T18:51:45.073027Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 33 frames, 5.5MB → 2.6MB (2.1x), 33 JPEGs deleted\n2026-04-28T18:52:11.079485Z WARN sqlx::query: summary=\"COMMIT\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=2.863818625s\n2026-04-28T18:52:13.829425Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=272 elapsed=1.205463375s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T18:57:00.274674Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=275 elapsed=2.229514334s\n2026-04-28T18:57:03.165166Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=53 elapsed=18.074134375s\n2026-04-28T18:57:03.165346Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 53 eligible frames\n2026-04-28T18:57:05.295348Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 26 frames, 6.8MB → 0.4MB (16.1x), 26 JPEGs deleted\n2026-04-28T18:57:09.900414Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.7MB → 1.1MB (4.2x), 25 JPEGs deleted\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T18:58:35.016645Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7048291109637827804, trigger=click)\n2026-04-28T19:00:46.037144Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-861378394059743613, trigger=visual_change)\n2026-04-28T19:01:15.697878Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8912297904943223984, trigger=visual_change)\n2026-04-28T19:02:26.221366Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=40 elapsed=15.89233725s\n2026-04-28T19:02:26.221825Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 40 eligible frames\n2026-04-28T19:02:29.576339Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.0MB → 0.4MB (11.8x), 19 JPEGs deleted\n2026-04-28T19:02:34.272184Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 3.1MB → 1.7MB (1.9x), 19 JPEGs deleted\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T19:06:07.674333Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.306041833s\n2026-04-28T19:07:49.677908Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=42 elapsed=14.889544208s\n2026-04-28T19:07:49.678057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 42 eligible frames\n2026-04-28T19:07:49.698803Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=2.614160833s\n2026-04-28T19:07:51.749436Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 16 frames, 4.2MB → 0.4MB (9.8x), 16 JPEGs deleted\n2026-04-28T19:07:54.899287Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 3.4MB → 2.0MB (1.7x), 24 JPEGs deleted\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T19:12:47.584193Z INFO screenpipe_engine::sleep_monitor: Screen locked (CGSession safety-net poll)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T19:13:11.255278Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.300413166s\n2026-04-28T19:13:12.794331Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=43 elapsed=13.258655834s\n2026-04-28T19:13:12.794470Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 43 eligible frames\n2026-04-28T19:13:12.808049Z INFO sck_rs::stream_manager: recreating stream for display 2 (resolution change)\n2026-04-28T19:13:12.912772Z WARN sqlx::query: summary=\"PRAGMA wal_checkpoint(TRUNCATE)\" db.statement=\"\" rows_affected=0 rows_returned=1 elapsed=3.082268708s\n2026-04-28T19:13:14.340148Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 20 frames, 5.2MB → 0.4MB (12.4x), 20 JPEGs deleted\n2026-04-28T19:13:16.959188Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.1MB → 1.2MB (2.6x), 21 JPEGs deleted\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T19:18:25.142345Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.23836225s\n2026-04-28T19:18:29.300778Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=12.331115584s\n2026-04-28T19:18:29.300988Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-28T19:18:30.226176Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.6MB → 0.4MB (6.3x), 10 JPEGs deleted\n2026-04-28T19:18:31.055886Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.5MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-28T19:22:38.544393Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.5900705s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T19:23:40.369244Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.312361333s\n2026-04-28T19:23:43.191714Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=18 elapsed=12.126468125s\n2026-04-28T19:23:43.192013Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 18 eligible frames\n2026-04-28T19:23:44.106092Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 8 frames, 2.1MB → 0.4MB (5.0x), 8 JPEGs deleted\n2026-04-28T19:23:44.986481Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 8 frames, 1.2MB → 0.2MB (5.6x), 8 JPEGs deleted\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T19:28:14.554244Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.295689792s\n2026-04-28T19:28:56.783829Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=2 elapsed=11.784984875s\n2026-04-28T19:28:56.783829Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=2.002671208s\n2026-04-28T19:28:56.784440Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 2 eligible frames\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T19:34:09.612319Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.744371791s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T19:39:22.341355Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.712969s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T19:44:34.476817Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.124650458s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T19:49:46.886222Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.407015833s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T19:54:59.091936Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.192314584s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T20:00:12.032661Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.9065265s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T20:05:24.232319Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.177178542s\n2026-04-28T20:05:35.453478Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.021219375s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T20:10:37.036038Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.788154208s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T20:15:49.333549Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.246618917s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T20:21:01.770347Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.407504125s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T20:26:14.358287Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.569856334s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T20:31:26.908016Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.558228667s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T20:36:39.175956Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.258857958s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T20:41:51.130413Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=11.939972875s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T20:47:04.036975Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.84198625s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T20:52:16.384693Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.330017792s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T20:57:28.742794Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.342226458s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T21:02:41.262921Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.525327291s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T21:07:51.994063Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=10.717519625s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T21:08:14.967216Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.590923666s\n2026-04-28T21:13:04.291137Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.286627042s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T21:18:10.800875Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.579926667s\n2026-04-28T21:18:16.422891Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.094094375s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T21:23:14.230473Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.169288125s\n2026-04-28T21:23:28.551252Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.114471625s\n2026-04-28T21:23:35.830878Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.096934083s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T21:28:39.497831Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=10.934832958s\n2026-04-28T21:28:49.944749Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.074718792s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T21:33:51.696608Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.191163792s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T21:39:04.217720Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.507398834s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T21:44:17.102738Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.855874417s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T21:49:29.594891Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.477808209s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T21:54:41.525895Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=11.889049083s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T21:59:44.640937Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=3.101056083s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T22:04:51.566764Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=6.913806041s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T22:09:08.667514Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.198861916s\n2026-04-28T22:10:02.395515Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=10.821276666s\n2026-04-28T22:10:50.318700Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.004136834s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T22:15:14.646427Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.238301292s\n2026-04-28T22:15:14.646817Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=2.519544s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T22:20:22.068957Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=7.408174875s\n2026-04-28T22:20:37.990962Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.168253125s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T22:23:18.698813Z INFO screenpipe_engine::sleep_monitor: Screen unlocked (CGSession safety-net poll)\n2026-04-28T22:23:18.706000Z INFO screenpipe_engine::event_driven_capture: invalidating persistent streams after unlock/wake for monitor 2\n2026-04-28T22:23:18.715962Z INFO sck_rs::stream_manager: stopped 1 persistent stream(s)\n2026-04-28T22:23:23.508163Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=3.313264166s\n2026-04-28T22:23:24.381024Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-28T22:23:29.464033Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)","depth":4,"value":"2026-04-28T16:07:03.361935Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:04.884403Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:05.202177Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:07.123899Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:08.584617Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:09.975643Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:10.221917Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:11.235748Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:11.573033Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:12.720817Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:13.085300Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:13.983235Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:15.315623Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:15.679709Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:16.294399Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:17.469168Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:17.704892Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:18.327350Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:18.584089Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:19.383211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:19.697209Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:20.683739Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:22.590735Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:23.502612Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:23.740842Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:24.632559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:24.961958Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:25.589407Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:30.159089Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:30.378744Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:34.788508Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:35.112244Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:35.943249Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:36.843570Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:37.166993Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:38.233737Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:42.733209Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:42.962402Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:44.443847Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:44.753972Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:57.769188Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:07:58.113833Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T16:08:32.137779Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:08:34.603773Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:08:34.932275Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:08:36.780956Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=89 elapsed=11.844145s\n2026-04-28T16:08:36.781045Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 89 eligible frames\n2026-04-28T16:08:40.099262Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 43 frames, 16.5MB → 0.6MB (26.1x), 43 JPEGs deleted\n2026-04-28T16:08:42.789812Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 44 frames, 7.7MB → 0.3MB (29.9x), 44 JPEGs deleted\n2026-04-28T16:08:47.816306Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:08:48.080973Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:08:49.055512Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:09:14.695030Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:09:14.946613Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:11:42.049193Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:11:42.534314Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:11:52.738708Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:11:53.064036Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:11:59.869884Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:12:00.215936Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:12:06.911557Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5781189571662577813, trigger=click)\n2026-04-28T16:12:07.093383Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5781189571662577813, trigger=click)\n2026-04-28T16:12:20.806166Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:21.032640Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:23.043723Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:23.369330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:25.662585Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:26.285107Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:27.289159Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:30.909210Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:31.157616Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:34.265113Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:34.507077Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T16:13:54.410986Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=81 elapsed=11.608799667s\n2026-04-28T16:13:54.411842Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 81 eligible frames\n2026-04-28T16:13:57.167507Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 15.7MB → 0.6MB (24.9x), 41 JPEGs deleted\n2026-04-28T16:13:59.574102Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 6.6MB → 0.3MB (25.9x), 38 JPEGs deleted\n2026-04-28T16:14:05.617758Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:14:30.003264Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4871134950740386536, trigger=click)\n2026-04-28T16:14:30.266331Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4871134950740386536, trigger=click)\n2026-04-28T16:14:36.255363Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=9092815945908542616, trigger=click)\n2026-04-28T16:14:36.548566Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=9092815945908542616, trigger=click)\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T16:19:08.931864Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=178 elapsed=1.132447167s\n2026-04-28T16:19:11.931756Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=76 elapsed=12.367092209s\n2026-04-28T16:19:11.931987Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 76 eligible frames\n2026-04-28T16:19:15.012481Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 37 frames, 14.2MB → 0.6MB (22.5x), 37 JPEGs deleted\n2026-04-28T16:19:17.554472Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 37 frames, 6.5MB → 0.3MB (25.2x), 37 JPEGs deleted\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T16:24:27.038545Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=178 elapsed=1.000578959s\n2026-04-28T16:24:29.034280Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=11.139412958s\n2026-04-28T16:24:29.035034Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-28T16:24:30.963871Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 23 frames, 8.8MB → 0.6MB (14.0x), 23 JPEGs deleted\n2026-04-28T16:24:32.350677Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.7MB → 0.3MB (14.4x), 21 JPEGs deleted\n2026-04-28T16:26:09.542993Z INFO screenpipe_engine::sleep_monitor: Screen locked (CGSession safety-net poll)\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T16:29:43.556469Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=43 elapsed=11.198770125s\n2026-04-28T16:29:43.556550Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 43 eligible frames\n2026-04-28T16:29:44.986491Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 8.1MB → 0.6MB (12.8x), 21 JPEGs deleted\n2026-04-28T16:29:46.268687Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 20 frames, 3.5MB → 0.3MB (13.8x), 20 JPEGs deleted\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T16:34:57.128232Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=24 elapsed=10.763956s\n2026-04-28T16:34:57.128230Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=178 elapsed=1.4624175s\n2026-04-28T16:34:57.131408Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 24 eligible frames\n2026-04-28T16:34:58.083167Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 4.2MB → 0.6MB (6.7x), 11 JPEGs deleted\n2026-04-28T16:34:58.887644Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 1.9MB → 0.3MB (7.6x), 11 JPEGs deleted\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T16:40:09.584894Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=6 elapsed=10.685695125s\n2026-04-28T16:40:09.587850Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 6 eligible frames\n2026-04-28T16:40:10.068260Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 2 frames, 0.8MB → 0.6MB (1.3x), 2 JPEGs deleted\n2026-04-28T16:40:10.414309Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 2 frames, 0.3MB → 0.2MB (1.6x), 2 JPEGs deleted\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T16:45:21.393195Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=2 elapsed=10.966809042s\n2026-04-28T16:45:21.393281Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 2 eligible frames\n2026-04-28T16:46:56.332846Z INFO screenpipe_engine::sleep_monitor: Screen unlocked (CGSession safety-net poll)\n2026-04-28T16:46:56.334007Z INFO screenpipe_engine::event_driven_capture: invalidating persistent streams after unlock/wake for monitor 2\n2026-04-28T16:46:56.352112Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\n2026-04-28T16:46:58.304757Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-28T16:46:58.565809Z WARN screenpipe_engine::event_driven_capture: skipping capture: lock screen app 'loginwindow' on monitor 1\n2026-04-28T16:46:58.897766Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-28T16:46:59.184093Z WARN screenpipe_engine::event_driven_capture: skipping capture: lock screen app 'loginwindow' on monitor 2\n2026-04-28T16:47:01.338502Z INFO screenpipe_engine::sleep_monitor: Screen unlocked (CGSession safety-net poll)\n2026-04-28T16:47:01.390301Z INFO screenpipe_engine::event_driven_capture: invalidating persistent streams after unlock/wake for monitor 2\n2026-04-28T16:47:02.630076Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\n2026-04-28T16:47:05.728990Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-28T16:47:07.623977Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-28T16:47:28.943957Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=179 elapsed=2.634386708s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T16:50:17.222019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6216647555668337619, trigger=click)\n2026-04-28T16:50:35.797720Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=14.383813625s\n2026-04-28T16:51:42.581111Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7104241776089826277, trigger=click)\n2026-04-28T16:51:44.019608Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7104241776089826277, trigger=click)\n2026-04-28T16:53:08.025195Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6139761258158646866, trigger=click)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T16:53:53.588281Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3939156275097735830, trigger=click)\n2026-04-28T16:55:49.235703Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.968643708s\n2026-04-28T16:57:04.416388Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8581538536659125863, trigger=click)\n2026-04-28T16:57:12.492178Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8581538536659125863, trigger=click)\n2026-04-28T16:57:12.841981Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8581538536659125863, trigger=click)\n2026-04-28T16:57:14.415251Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8581538536659125863, trigger=visual_change)\n2026-04-28T16:57:14.726963Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8581538536659125863, trigger=click)\n2026-04-28T16:57:17.407196Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8581538536659125863, trigger=visual_change)\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T17:00:57.997500Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=196 elapsed=2.082627917s\n2026-04-28T17:01:14.953984Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=37 elapsed=24.41720925s\n2026-04-28T17:01:14.966099Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 37 eligible frames\n2026-04-28T17:01:17.943398Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 3.3MB → 0.4MB (8.8x), 18 JPEGs deleted\n2026-04-28T17:01:22.631343Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 2.9MB → 1.1MB (2.5x), 19 JPEGs deleted\n2026-04-28T17:01:33.886858Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=197 elapsed=1.1513605s\n2026-04-28T17:01:35.848522Z INFO screenpipe_engine::meeting_detector: meeting v2: Idle -> Confirming (app=Firefox, signals=2)\n2026-04-28T17:01:41.903090Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=197 elapsed=1.052568042s\n2026-04-28T17:01:45.412020Z INFO screenpipe_engine::meeting_detector: meeting v2: Confirming -> Active (app=Firefox, signals=2, browser=true)\n2026-04-28T17:01:46.211477Z INFO screenpipe_engine::meeting_detector: meeting v2: meeting started (id=18, app=Firefox, title=None)\n2026-04-28T17:02:53.351145Z WARN sqlx::query: summary=\"COMMIT\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=1.195813541s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T17:04:32.492320Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T17:04:40.831992Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)\n2026-04-28T17:05:19.749943Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=520550632255337786, trigger=visual_change)\n2026-04-28T17:06:36.762718Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8913262551050344622, trigger=click)\n2026-04-28T17:06:37.394423Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8913262551050344622, trigger=click)\n2026-04-28T17:06:38.571150Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=78 elapsed=15.889136334s\n2026-04-28T17:06:38.571330Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 78 eligible frames\n2026-04-28T17:06:41.727150Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 36 frames, 8.7MB → 1.5MB (5.7x), 36 JPEGs deleted\n2026-04-28T17:06:47.337599Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 6.3MB → 2.8MB (2.2x), 40 JPEGs deleted\n2026-04-28T17:07:35.259124Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=203 elapsed=1.296070334s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T17:11:54.187082Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=209 elapsed=1.028743583s\n2026-04-28T17:11:57.308650Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8297064725994209049, trigger=visual_change)\n2026-04-28T17:12:03.975962Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=97 elapsed=16.608343459s\n2026-04-28T17:12:03.980035Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 97 eligible frames\n2026-04-28T17:12:09.423715Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 8.8MB → 1.3MB (7.0x), 38 JPEGs deleted\n2026-04-28T17:12:18.745568Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 57 frames, 9.2MB → 5.1MB (1.8x), 57 JPEGs deleted\n2026-04-28T17:12:28.910725Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8297064725994209049, trigger=click)\n2026-04-28T17:12:47.242180Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=210 elapsed=1.053630416s\n2026-04-28T17:12:50.549067Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7463698365302281039, trigger=click)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T17:13:10.200772Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5154540507509216989, trigger=click)\n2026-04-28T17:13:10.768365Z WARN sqlx::query: summary=\"PRAGMA wal_checkpoint(TRUNCATE)\" db.statement=\"\" rows_affected=0 rows_returned=1 elapsed=1.391680292s\n2026-04-28T17:17:32.658004Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=212 elapsed=2.466153666s\n2026-04-28T17:17:35.955873Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=app_switch, monitor=1) — DB pool may be saturated\n2026-04-28T17:17:44.553826Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=64 elapsed=25.777843041s\n2026-04-28T17:17:44.559382Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 64 eligible frames\n2026-04-28T17:17:50.399756Z INFO screenpipe_engine::event_driven_capture: monitor 1 capture recovered after 1 consecutive errors\n2026-04-28T17:17:50.799123Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 30 frames, 5.2MB → 2.2MB (2.4x), 30 JPEGs deleted\n2026-04-28T17:18:01.010642Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 32 frames, 6.5MB → 2.9MB (2.3x), 32 JPEGs deleted\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T17:18:33.982766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7174140395946848829, trigger=click)\n2026-04-28T17:18:59.164878Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3302386423956492591, trigger=click)\n2026-04-28T17:19:41.104295Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3302386423956492591, trigger=visual_change)\n2026-04-28T17:21:03.299035Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=1.689362708s\n2026-04-28T17:21:52.490456Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4085796735682377830, trigger=visual_change)\n2026-04-28T17:22:50.204657Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5154540507509216989, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T17:23:14.691712Z WARN sqlx::query: summary=\"PRAGMA wal_checkpoint(TRUNCATE)\" db.statement=\"\" rows_affected=0 rows_returned=1 elapsed=5.316957667s\n2026-04-28T17:23:14.705751Z WARN screenpipe_db::db: wal checkpoint: busy (could not truncate), 358 pages in WAL\n2026-04-28T17:23:14.732610Z WARN sqlx::query: summary=\"BEGIN IMMEDIATE\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=2.276639s\n2026-04-28T17:23:14.953280Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=2.135656625s\n2026-04-28T17:23:17.000358Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=32621934252632853, trigger=click)\n2026-04-28T17:23:18.870480Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=63 elapsed=17.872300875s\n2026-04-28T17:23:18.870810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 63 eligible frames\n2026-04-28T17:23:24.674735Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 4.4MB → 1.6MB (2.7x), 27 JPEGs deleted\n2026-04-28T17:23:30.134096Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 34 frames, 6.0MB → 2.6MB (2.3x), 34 JPEGs deleted\n2026-04-28T17:23:47.062619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)\n2026-04-28T17:23:47.660094Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=visual_change)\n2026-04-28T17:24:26.590876Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=visual_change)\n2026-04-28T17:24:35.057777Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)\n2026-04-28T17:24:36.251095Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=visual_change)\n2026-04-28T17:24:39.405376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=visual_change)\n2026-04-28T17:24:53.019411Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)\n2026-04-28T17:25:14.348055Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=click)\n2026-04-28T17:25:30.864453Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=click)\n2026-04-28T17:25:31.625221Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)\n2026-04-28T17:27:39.084601Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T17:27:46.115702Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T17:28:43.734362Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=1.59602225s\n2026-04-28T17:28:52.344071Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=61 elapsed=22.19854525s\n2026-04-28T17:28:52.344502Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 61 eligible frames\n2026-04-28T17:29:01.211744Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 31 frames, 5.3MB → 1.9MB (2.7x), 31 JPEGs deleted\n2026-04-28T17:29:11.576322Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 28 frames, 5.0MB → 3.2MB (1.6x), 28 JPEGs deleted\n2026-04-28T17:30:06.736879Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8813990094162065370, trigger=visual_change)\n2026-04-28T17:31:16.370446Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:31:17.489267Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:31:24.338365Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)\n2026-04-28T17:31:49.223910Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)\n2026-04-28T17:31:55.489490Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)\n2026-04-28T17:31:57.951399Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=visual_change)\n2026-04-28T17:31:58.927289Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:32:02.151996Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:32:02.752775Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:32:05.672044Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:32:10.766730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:32:11.767270Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:32:14.898520Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)\n2026-04-28T17:32:30.033898Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)\n2026-04-28T17:32:36.337641Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)\n2026-04-28T17:32:42.601724Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)\n2026-04-28T17:32:49.882686Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)\n2026-04-28T17:32:52.871340Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T17:33:20.872909Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)\n2026-04-28T17:34:33.267284Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=2.737059125s\n2026-04-28T17:34:35.268208Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=50 elapsed=23.676462709s\n2026-04-28T17:34:35.269171Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 50 eligible frames\n2026-04-28T17:34:40.919221Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T17:34:43.456560Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 23 frames, 3.8MB → 1.3MB (2.9x), 23 JPEGs deleted\n2026-04-28T17:34:49.828980Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.8MB → 1.5MB (3.2x), 25 JPEGs deleted\n2026-04-28T17:34:51.319224Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)\n2026-04-28T17:37:53.608170Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=1.446908208s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T17:38:38.976168Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-844953656408637404, trigger=visual_change)\n2026-04-28T17:38:45.388397Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-844953656408637404, trigger=visual_change)\n2026-04-28T17:38:54.425051Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7805582611831809135, trigger=visual_change)\n2026-04-28T17:40:08.683806Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=53 elapsed=18.758745375s\n2026-04-28T17:40:08.684515Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 53 eligible frames\n2026-04-28T17:40:08.720339Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=1.41316125s\n2026-04-28T17:40:14.527057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 4.4MB → 1.8MB (2.5x), 27 JPEGs deleted\n2026-04-28T17:40:19.017809Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 5.0MB → 1.7MB (3.0x), 24 JPEGs deleted\n2026-04-28T17:40:45.760291Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-1920675205105101407, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T17:44:44.523433Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6005834167210030885, trigger=click)\n2026-04-28T17:45:36.046790Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=2.354551584s\n2026-04-28T17:45:48.797258Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=35 elapsed=29.080941084s\n2026-04-28T17:45:48.797852Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 35 eligible frames\n2026-04-28T17:45:52.808293Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 2.8MB → 1.1MB (2.6x), 17 JPEGs deleted\n2026-04-28T17:45:56.267588Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 16 frames, 2.9MB → 0.9MB (3.2x), 16 JPEGs deleted\n2026-04-28T17:45:59.734072Z WARN sqlx::query: summary=\"BEGIN IMMEDIATE\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=2.43974075s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T17:48:11.307977Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-310266387443272529, trigger=click)\n2026-04-28T17:50:06.399275Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=215 elapsed=1.493682625s\n2026-04-28T17:51:22.688798Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=43 elapsed=26.391488834s\n2026-04-28T17:51:22.690714Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 43 eligible frames\n2026-04-28T17:51:29.036691Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.6MB → 1.4MB (2.7x), 22 JPEGs deleted\n2026-04-28T17:51:32.222940Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 2.7MB → 0.4MB (6.6x), 19 JPEGs deleted\n2026-04-28T17:52:04.754173Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3769295062857853594, trigger=click)\n2026-04-28T17:52:13.489892Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3769295062857853594, trigger=visual_change)\n2026-04-28T17:52:15.091164Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3769295062857853594, trigger=click)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T17:53:48.873572Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6254911494541167184, trigger=click)\n2026-04-28T17:56:43.964294Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=216 elapsed=1.621008083s\n2026-04-28T17:56:53.860942Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=43 elapsed=21.317519709s\n2026-04-28T17:56:53.861419Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 43 eligible frames\n2026-04-28T17:56:58.615624Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 23 frames, 3.5MB → 1.3MB (2.6x), 23 JPEGs deleted\n2026-04-28T17:57:02.978805Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.7MB → 0.8MB (3.2x), 18 JPEGs deleted\n2026-04-28T17:57:26.396309Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T17:57:32.405615Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T18:01:25.451495Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T18:01:26.059212Z WARN sqlx::query: summary=\"COMMIT\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=2.378852666s\n2026-04-28T18:01:32.813958Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)\n2026-04-28T18:02:22.865372Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=59 elapsed=19.861929375s\n2026-04-28T18:02:22.868572Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 59 eligible frames\n2026-04-28T18:02:28.010325Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 4.4MB → 1.6MB (2.7x), 27 JPEGs deleted\n2026-04-28T18:02:31.034840Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T18:02:35.341581Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 30 frames, 5.4MB → 2.2MB (2.4x), 30 JPEGs deleted\n2026-04-28T18:02:52.414456Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T18:03:22.286014Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T18:06:38.897268Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=225 elapsed=1.272339875s\n2026-04-28T18:06:56.830727Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3059468017859355985, trigger=visual_change)\n2026-04-28T18:07:46.547699Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=226 elapsed=1.289059583s\n2026-04-28T18:07:49.469402Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=73 elapsed=13.809847041s\n2026-04-28T18:07:49.469802Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 73 eligible frames\n2026-04-28T18:07:54.084967Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 36 frames, 6.2MB → 2.3MB (2.7x), 36 JPEGs deleted\n2026-04-28T18:07:58.202315Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 35 frames, 6.5MB → 3.1MB (2.1x), 35 JPEGs deleted\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T18:08:30.182501Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Idle (timeout=300s, app=Firefox, id=18)\n2026-04-28T18:08:31.026260Z INFO screenpipe_engine::meeting_detector: meeting v2: meeting ended (id=18)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T18:13:12.197365Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=57 elapsed=13.981802916s\n2026-04-28T18:13:12.201813Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 57 eligible frames\n2026-04-28T18:13:12.369500Z WARN sqlx::query: summary=\"PRAGMA wal_checkpoint(TRUNCATE)\" db.statement=\"\" rows_affected=0 rows_returned=1 elapsed=2.777140458s\n2026-04-28T18:13:16.080941Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 3.8MB → 1.2MB (3.1x), 24 JPEGs deleted\n2026-04-28T18:13:22.515083Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 31 frames, 5.2MB → 2.0MB (2.6x), 31 JPEGs deleted\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T18:18:45.389294Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=72 elapsed=22.856535958s\n2026-04-28T18:18:45.394002Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 72 eligible frames\n2026-04-28T18:18:45.477022Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=245 elapsed=1.363011375s\n2026-04-28T18:18:52.269655Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 32 frames, 7.9MB → 1.3MB (5.9x), 32 JPEGs deleted\n2026-04-28T18:19:00.406515Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 6.1MB → 2.3MB (2.6x), 38 JPEGs deleted\n2026-04-28T18:21:03.916795Z WARN sqlx::query: summary=\"BEGIN IMMEDIATE\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=1.642808625s\n2026-04-28T18:21:31.158779Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=245 elapsed=1.711686125s\n2026-04-28T18:22:12.801109Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8839231840523050937, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T18:24:16.556243Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=78 elapsed=16.13078575s\n2026-04-28T18:24:16.559056Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 78 eligible frames\n2026-04-28T18:24:16.596020Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=246 elapsed=1.752819416s\n2026-04-28T18:24:21.049775Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 31 frames, 8.1MB → 0.4MB (18.8x), 31 JPEGs deleted\n2026-04-28T18:24:35.718459Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 45 frames, 7.3MB → 2.7MB (2.7x), 45 JPEGs deleted\n2026-04-28T18:27:46.371199Z WARN sqlx::query: summary=\"BEGIN IMMEDIATE\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=1.099897791s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T18:29:48.752521Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=255 elapsed=2.115721292s\n2026-04-28T18:29:51.054020Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=70 elapsed=15.212678792s\n2026-04-28T18:29:51.054164Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 70 eligible frames\n2026-04-28T18:29:53.661408Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 30 frames, 7.9MB → 0.5MB (14.5x), 30 JPEGs deleted\n2026-04-28T18:29:59.515910Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 6.1MB → 2.6MB (2.3x), 38 JPEGs deleted\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T18:35:11.275137Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=257 elapsed=1.890251791s\n2026-04-28T18:35:13.565990Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=58 elapsed=14.023576042s\n2026-04-28T18:35:13.566708Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 58 eligible frames\n2026-04-28T18:35:15.986131Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 6.3MB → 0.4MB (14.8x), 24 JPEGs deleted\n2026-04-28T18:35:21.127038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 32 frames, 4.8MB → 2.0MB (2.4x), 32 JPEGs deleted\n2026-04-28T18:36:21.444171Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=257 elapsed=1.478779s\n2026-04-28T18:36:54.736632Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7349402793474718158, trigger=visual_change)\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T18:38:24.648333Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7138146743394558203, trigger=click)\n2026-04-28T18:40:30.102499Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=264 elapsed=2.280901875s\n2026-04-28T18:40:41.876243Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=55 elapsed=20.714885166s\n2026-04-28T18:40:41.877272Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 55 eligible frames\n2026-04-28T18:40:43.565653Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 20 frames, 5.2MB → 0.4MB (12.4x), 20 JPEGs deleted\n2026-04-28T18:40:47.405111Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 33 frames, 5.0MB → 2.2MB (2.2x), 33 JPEGs deleted\n2026-04-28T18:40:55.281930Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=264 elapsed=2.497021667s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T18:45:57.736770Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=269 elapsed=1.472064125s\n2026-04-28T18:46:02.552257Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=36 elapsed=15.12999075s\n2026-04-28T18:46:02.552440Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 36 eligible frames\n2026-04-28T18:46:03.937817Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 3.4MB → 0.4MB (8.2x), 13 JPEGs deleted\n2026-04-28T18:46:06.882225Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.2MB → 1.5MB (2.2x), 21 JPEGs deleted\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T18:48:36.805777Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5539694277092651559, trigger=visual_change)\n2026-04-28T18:49:57.584913Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5539694277092651559, trigger=visual_change)\n2026-04-28T18:50:04.730346Z WARN sqlx::query: summary=\"BEGIN IMMEDIATE\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=1.905377875s\n2026-04-28T18:50:43.113582Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=271 elapsed=1.116028833s\n2026-04-28T18:51:29.107031Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=53 elapsed=20.394365583s\n2026-04-28T18:51:29.107446Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 53 eligible frames\n2026-04-28T18:51:35.119217Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 4.7MB → 0.4MB (11.2x), 18 JPEGs deleted\n2026-04-28T18:51:45.073027Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 33 frames, 5.5MB → 2.6MB (2.1x), 33 JPEGs deleted\n2026-04-28T18:52:11.079485Z WARN sqlx::query: summary=\"COMMIT\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=2.863818625s\n2026-04-28T18:52:13.829425Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=272 elapsed=1.205463375s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T18:57:00.274674Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=275 elapsed=2.229514334s\n2026-04-28T18:57:03.165166Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=53 elapsed=18.074134375s\n2026-04-28T18:57:03.165346Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 53 eligible frames\n2026-04-28T18:57:05.295348Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 26 frames, 6.8MB → 0.4MB (16.1x), 26 JPEGs deleted\n2026-04-28T18:57:09.900414Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.7MB → 1.1MB (4.2x), 25 JPEGs deleted\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T18:58:35.016645Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7048291109637827804, trigger=click)\n2026-04-28T19:00:46.037144Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-861378394059743613, trigger=visual_change)\n2026-04-28T19:01:15.697878Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8912297904943223984, trigger=visual_change)\n2026-04-28T19:02:26.221366Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=40 elapsed=15.89233725s\n2026-04-28T19:02:26.221825Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 40 eligible frames\n2026-04-28T19:02:29.576339Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.0MB → 0.4MB (11.8x), 19 JPEGs deleted\n2026-04-28T19:02:34.272184Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 3.1MB → 1.7MB (1.9x), 19 JPEGs deleted\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T19:06:07.674333Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.306041833s\n2026-04-28T19:07:49.677908Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=42 elapsed=14.889544208s\n2026-04-28T19:07:49.678057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 42 eligible frames\n2026-04-28T19:07:49.698803Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=2.614160833s\n2026-04-28T19:07:51.749436Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 16 frames, 4.2MB → 0.4MB (9.8x), 16 JPEGs deleted\n2026-04-28T19:07:54.899287Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 3.4MB → 2.0MB (1.7x), 24 JPEGs deleted\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T19:12:47.584193Z INFO screenpipe_engine::sleep_monitor: Screen locked (CGSession safety-net poll)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T19:13:11.255278Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.300413166s\n2026-04-28T19:13:12.794331Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=43 elapsed=13.258655834s\n2026-04-28T19:13:12.794470Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 43 eligible frames\n2026-04-28T19:13:12.808049Z INFO sck_rs::stream_manager: recreating stream for display 2 (resolution change)\n2026-04-28T19:13:12.912772Z WARN sqlx::query: summary=\"PRAGMA wal_checkpoint(TRUNCATE)\" db.statement=\"\" rows_affected=0 rows_returned=1 elapsed=3.082268708s\n2026-04-28T19:13:14.340148Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 20 frames, 5.2MB → 0.4MB (12.4x), 20 JPEGs deleted\n2026-04-28T19:13:16.959188Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.1MB → 1.2MB (2.6x), 21 JPEGs deleted\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T19:18:25.142345Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.23836225s\n2026-04-28T19:18:29.300778Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=12.331115584s\n2026-04-28T19:18:29.300988Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-28T19:18:30.226176Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.6MB → 0.4MB (6.3x), 10 JPEGs deleted\n2026-04-28T19:18:31.055886Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.5MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-28T19:22:38.544393Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.5900705s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T19:23:40.369244Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.312361333s\n2026-04-28T19:23:43.191714Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=18 elapsed=12.126468125s\n2026-04-28T19:23:43.192013Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 18 eligible frames\n2026-04-28T19:23:44.106092Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 8 frames, 2.1MB → 0.4MB (5.0x), 8 JPEGs deleted\n2026-04-28T19:23:44.986481Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 8 frames, 1.2MB → 0.2MB (5.6x), 8 JPEGs deleted\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T19:28:14.554244Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.295689792s\n2026-04-28T19:28:56.783829Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=2 elapsed=11.784984875s\n2026-04-28T19:28:56.783829Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=2.002671208s\n2026-04-28T19:28:56.784440Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 2 eligible frames\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T19:34:09.612319Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.744371791s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T19:39:22.341355Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.712969s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T19:44:34.476817Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.124650458s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T19:49:46.886222Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.407015833s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T19:54:59.091936Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.192314584s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T20:00:12.032661Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.9065265s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T20:05:24.232319Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.177178542s\n2026-04-28T20:05:35.453478Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.021219375s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T20:10:37.036038Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.788154208s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T20:15:49.333549Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.246618917s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T20:21:01.770347Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.407504125s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T20:26:14.358287Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.569856334s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T20:31:26.908016Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.558228667s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T20:36:39.175956Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.258857958s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T20:41:51.130413Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=11.939972875s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T20:47:04.036975Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.84198625s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T20:52:16.384693Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.330017792s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T20:57:28.742794Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.342226458s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T21:02:41.262921Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.525327291s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T21:07:51.994063Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=10.717519625s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T21:08:14.967216Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.590923666s\n2026-04-28T21:13:04.291137Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.286627042s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T21:18:10.800875Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.579926667s\n2026-04-28T21:18:16.422891Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.094094375s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T21:23:14.230473Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.169288125s\n2026-04-28T21:23:28.551252Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.114471625s\n2026-04-28T21:23:35.830878Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.096934083s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T21:28:39.497831Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=10.934832958s\n2026-04-28T21:28:49.944749Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.074718792s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T21:33:51.696608Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.191163792s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T21:39:04.217720Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.507398834s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T21:44:17.102738Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.855874417s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T21:49:29.594891Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.477808209s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T21:54:41.525895Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=11.889049083s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T21:59:44.640937Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=3.101056083s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T22:04:51.566764Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=6.913806041s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T22:09:08.667514Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.198861916s\n2026-04-28T22:10:02.395515Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=10.821276666s\n2026-04-28T22:10:50.318700Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.004136834s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T22:15:14.646427Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.238301292s\n2026-04-28T22:15:14.646817Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=2.519544s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T22:20:22.068957Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=7.408174875s\n2026-04-28T22:20:37.990962Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.168253125s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T22:23:18.698813Z INFO screenpipe_engine::sleep_monitor: Screen unlocked (CGSession safety-net poll)\n2026-04-28T22:23:18.706000Z INFO screenpipe_engine::event_driven_capture: invalidating persistent streams after unlock/wake for monitor 2\n2026-04-28T22:23:18.715962Z INFO sck_rs::stream_manager: stopped 1 persistent stream(s)\n2026-04-28T22:23:23.508163Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=3.313264166s\n2026-04-28T22:23:24.381024Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-28T22:23:29.464033Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)","is_focused":true},{"role":"AXTextField","text":"you","depth":3,"bounds":{"left":0.64793885,"top":1.0,"width":0.0625,"height":-0.07581806},"automation_id":"_NS:65","value":"you","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.64860374,"top":1.0,"width":0.00831117,"height":-0.07581806},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.7017952,"top":1.0,"width":0.00731383,"height":-0.07581806},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.7130984,"top":1.0,"width":0.006981383,"height":-0.07661617},"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.7200798,"top":1.0,"width":0.006981383,"height":-0.07661617},"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.09424867,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.3645279,"top":1.0,"width":0.09424867,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.3665226,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.4587766,"top":1.0,"width":0.094082445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.46077126,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.55285907,"top":1.0,"width":0.094082445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.55485374,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.6469415,"top":1.0,"width":0.094082445,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.64893615,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.4956782,"top":1.0,"width":0.027925532,"height":-0.02394259},"role_description":"text"}]...
|
701252836073547312
|
914767387301356915
|
click
|
accessibility
|
NULL
|
2026-04-28T16:07:03.361935Z INFO screenpipe_engin 2026-04-28T16:07:03.361935Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:04.884403Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:05.202177Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:07.123899Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:08.584617Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:09.975643Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:10.221917Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:11.235748Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:11.573033Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:12.720817Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:13.085300Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:13.983235Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:15.315623Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:15.679709Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:16.294399Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:17.469168Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:17.704892Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:18.327350Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:18.584089Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:19.383211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:19.697209Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:20.683739Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:22.590735Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:23.502612Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:23.740842Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:24.632559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:24.961958Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:25.589407Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:30.159089Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:30.378744Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:34.788508Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:35.112244Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:35.943249Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:36.843570Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:37.166993Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:38.233737Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:42.733209Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:42.962402Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:44.443847Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:44.753972Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:57.769188Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:07:58.113833Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-04-28T16:08:32.137779Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:08:34.603773Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:08:34.932275Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:08:36.780956Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=89 elapsed=11.844145s
2026-04-28T16:08:36.781045Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 89 eligible frames
2026-04-28T16:08:40.099262Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 43 frames, 16.5MB → 0.6MB (26.1x), 43 JPEGs deleted
2026-04-28T16:08:42.789812Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 44 frames, 7.7MB → 0.3MB (29.9x), 44 JPEGs deleted
2026-04-28T16:08:47.816306Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:08:48.080973Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:08:49.055512Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:09:14.695030Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:09:14.946613Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:11:42.049193Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:11:42.534314Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:11:52.738708Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:11:53.064036Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:11:59.869884Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:12:00.215936Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:12:06.911557Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5781189571662577813, trigger=click)
2026-04-28T16:12:07.093383Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5781189571662577813, trigger=click)
2026-04-28T16:12:20.806166Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:21.032640Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:23.043723Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:23.369330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:25.662585Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:26.285107Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:27.289159Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:30.909210Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:31.157616Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:34.265113Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:34.507077Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
tip: install a starter bundle of pipes:
screenpipe install https://screenpi.pe/start.json
2026-04-28T16:13:54.410986Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=81 elapsed=11.608799667s
2026-04-28T16:13:54.411842Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 81 eligible frames
2026-04-28T16:13:57.167507Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 15.7MB → 0.6MB (24.9x), 41 JPEGs deleted
2026-04-28T16:13:59.574102Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 6.6MB → 0.3MB (25.9x), 38 JPEGs deleted
2026-04-28T16:14:05.617758Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:14:30.003264Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4871134950740386536, trigger=click)
2026-04-28T16:14:30.266331Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4871134950740386536, trigger=click)
2026-04-28T16:14:36.255363Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=9092815945908542616, trigger=click)
2026-04-28T16:14:36.548566Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=9092815945908542616, trigger=click)
tip: sign in for higher AI quotas + cloud sync:
screenpipe login
2026-04-28T16:19:08.931864Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=178 elapsed=1.132447167s
2026-04-28T16:19:11.931756Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=76 elapsed=12.367092209s
2026-04-28T16:19:11.931987Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 76 eligible frames
2026-04-28T16:19:15.012481Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 37 frames, 14.2MB → 0.6MB (22.5x), 37 JPEGs deleted
2026-04-28T16:19:17.554472Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 37 frames, 6.5MB → 0.3MB (25.2x), 37 JPEGs deleted
tip: get the screenpipe desktop app for the full experience
https://screenpi.pe
2026-04-28T16:24:27.038545Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=178 elapsed=1.000578959s
2026-04-28T16:24:29.034280Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=46 elapsed=11.139412958s
2026-04-28T16:24:29.035034Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames
2026-04-28T16:24:30.963871Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 23 frames, 8.8MB → 0.6MB (14.0x), 23 JPEGs deleted
2026-04-28T16:24:32.350677Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.7MB → 0.3MB (14.4x), 21 JPEGs deleted
2026-04-28T16:26:09.542993Z INFO screenpipe_engine::sleep_monitor: Screen locked (CGSession safety-net poll)
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-04-28T16:29:43.556469Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=43 elapsed=11.198770125s
2026-04-28T16:29:43.556550Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 43 eligible frames
2026-04-28T16:29:44.986491Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 8.1MB → 0.6MB (12.8x), 21 JPEGs deleted
2026-04-28T16:29:46.268687Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 20 frames, 3.5MB → 0.3MB (13.8x), 20 JPEGs deleted
tip: install a starter bundle of pipes:
screenpipe install https://screenpi.pe/start.json
2026-04-28T16:34:57.128232Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=24 elapsed=10.763956s
2026-04-28T16:34:57.128230Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=178 elapsed=1.4624175s
2026-04-28T16:34:57.131408Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 24 eligible frames
2026-04-28T16:34:58.083167Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 4.2MB → 0.6MB (6.7x), 11 JPEGs deleted
2026-04-28T16:34:58.887644Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 1.9MB → 0.3MB (7.6x), 11 JPEGs deleted
tip: sign in for higher AI quotas + cloud sync:
screenpipe login
2026-04-28T16:40:09.584894Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=6 elapsed=10.685695125s
2026-04-28T16:40:09.587850Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 6 eligible frames
2026-04-28T16:40:10.068260Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 2 frames, 0.8MB → 0.6MB (1.3x), 2 JPEGs deleted
2026-04-28T16:40:10.414309Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 2 frames, 0.3MB → 0.2MB (1.6x), 2 JPEGs deleted
tip: get the screenpipe desktop app for the full experience
https://screenpi.pe
2026-04-28T16:45:21.393195Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=2 elapsed=10.966809042s
2026-04-28T16:45:21.393281Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 2 eligible frames
2026-04-28T16:46:56.332846Z INFO screenpipe_engine::sleep_monitor: Screen unlocked (CGSession safety-net poll)
2026-04-28T16:46:56.334007Z INFO screenpipe_engine::event_driven_capture: invalidating persistent streams after unlock/wake for monitor 2
2026-04-28T16:46:56.352112Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
2026-04-28T16:46:58.304757Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)
2026-04-28T16:46:58.565809Z WARN screenpipe_engine::event_driven_capture: skipping capture: lock screen app 'loginwindow' on monitor 1
2026-04-28T16:46:58.897766Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)
2026-04-28T16:46:59.184093Z WARN screenpipe_engine::event_driven_capture: skipping capture: lock screen app 'loginwindow' on monitor 2
2026-04-28T16:47:01.338502Z INFO screenpipe_engine::sleep_monitor: Screen unlocked (CGSession safety-net poll)
2026-04-28T16:47:01.390301Z INFO screenpipe_engine::event_driven_capture: invalidating persistent streams after unlock/wake for monitor 2
2026-04-28T16:47:02.630076Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
2026-04-28T16:47:05.728990Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)
2026-04-28T16:47:07.623977Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)
2026-04-28T16:47:28.943957Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=179 elapsed=2.634386708s
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-04-28T16:50:17.222019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6216647555668337619, trigger=click)
2026-04-28T16:50:35.797720Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=0 elapsed=14.383813625s
2026-04-28T16:51:42.581111Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7104241776089826277, trigger=click)
2026-04-28T16:51:44.019608Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7104241776089826277, trigger=click)
2026-04-28T16:53:08.025195Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6139761258158646866, trigger=click)
tip: install a starter bundle of pipes:
screenpipe install https://screenpi.pe/start.json
2026-04-28T16:53:53.588281Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3939156275097735830, trigger=click)
2026-04-28T16:55:49.235703Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=0 elapsed=12.968643708s
2026-04-28T16:57:04.416388Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8581538536659125863, trigger=click)
2026-04-28T16:57:12.492178Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8581538536659125863, trigger=click)
2026-04-28T16:57:12.841981Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8581538536659125863, trigger=click)
2026-04-28T16:57:14.415251Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8581538536659125863, trigger=visual_change)
2026-04-28T16:57:14.726963Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8581538536659125863, trigger=click)
2026-04-28T16:57:17.407196Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8581538536659125863, trigger=visual_change)
tip: sign in for higher AI quotas + cloud sync:
screenpipe login
2026-04-28T17:00:57.997500Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=196 elapsed=2.082627917s
2026-04-28T17:01:14.953984Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=37 elapsed=24.41720925s
2026-04-28T17:01:14.966099Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 37 eligible frames
2026-04-28T17:01:17.943398Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 3.3MB → 0.4MB (8.8x), 18 JPEGs deleted
2026-04-28T17:01:22.631343Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 2.9MB → 1.1MB (2.5x), 19 JPEGs deleted
2026-04-28T17:01:33.886858Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=197 elapsed=1.1513605s
2026-04-28T17:01:35.848522Z INFO screenpipe_engine::meeting_detector: meeting v2: Idle -> Confirming (app=Firefox, signals=2)
2026-04-28T17:01:41.903090Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=197 elapsed=1.052568042s
2026-04-28T17:01:45.412020Z INFO screenpipe_engine::meeting_detector: meeting v2: Confirming -> Active (app=Firefox, signals=2, browser=true)
2026-04-28T17:01:46.211477Z INFO screenpipe_engine::meeting_detector: meeting v2: meeting started (id=18, app=Firefox, title=None)
2026-04-28T17:02:53.351145Z WARN sqlx::query: summary="COMMIT" db.statement="" rows_affected=1 rows_returned=0 elapsed=1.195813541s
tip: get the screenpipe desktop app for the full experience
https://screenpi.pe
2026-04-28T17:04:32.492320Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)
2026-04-28T17:04:40.831992Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)
2026-04-28T17:05:19.749943Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=520550632255337786, trigger=visual_change)
2026-04-28T17:06:36.762718Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8913262551050344622, trigger=click)
2026-04-28T17:06:37.394423Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8913262551050344622, trigger=click)
2026-04-28T17:06:38.571150Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=78 elapsed=15.889136334s
2026-04-28T17:06:38.571330Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 78 eligible frames
2026-04-28T17:06:41.727150Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 36 frames, 8.7MB → 1.5MB (5.7x), 36 JPEGs deleted
2026-04-28T17:06:47.337599Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 6.3MB → 2.8MB (2.2x), 40 JPEGs deleted
2026-04-28T17:07:35.259124Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=203 elapsed=1.296070334s
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-04-28T17:11:54.187082Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=209 elapsed=1.028743583s
2026-04-28T17:11:57.308650Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8297064725994209049, trigger=visual_change)
2026-04-28T17:12:03.975962Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=97 elapsed=16.608343459s
2026-04-28T17:12:03.980035Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 97 eligible frames
2026-04-28T17:12:09.423715Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 8.8MB → 1.3MB (7.0x), 38 JPEGs deleted
2026-04-28T17:12:18.745568Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 57 frames, 9.2MB → 5.1MB (1.8x), 57 JPEGs deleted
2026-04-28T17:12:28.910725Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8297064725994209049, trigger=click)
2026-04-28T17:12:47.242180Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=210 elapsed=1.053630416s
2026-04-28T17:12:50.549067Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7463698365302281039, trigger=click)
tip: install a starter bundle of pipes:
screenpipe install https://screenpi.pe/start.json
2026-04-28T17:13:10.200772Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5154540507509216989, trigger=click)
2026-04-28T17:13:10.768365Z WARN sqlx::query: summary="PRAGMA wal_checkpoint(TRUNCATE)" db.statement="" rows_affected=0 rows_returned=1 elapsed=1.391680292s
2026-04-28T17:17:32.658004Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=212 elapsed=2.466153666s
2026-04-28T17:17:35.955873Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=app_switch, monitor=1) — DB pool may be saturated
2026-04-28T17:17:44.553826Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=64 elapsed=25.777843041s
2026-04-28T17:17:44.559382Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 64 eligible frames
2026-04-28T17:17:50.399756Z INFO screenpipe_engine::event_driven_capture: monitor 1 capture recovered after 1 consecutive errors
2026-04-28T17:17:50.799123Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 30 frames, 5.2MB → 2.2MB (2.4x), 30 JPEGs deleted
2026-04-28T17:18:01.010642Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 32 frames, 6.5MB → 2.9MB (2.3x), 32 JPEGs deleted
tip: sign in for higher AI quotas + cloud sync:
screenpipe login
2026-04-28T17:18:33.982766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7174140395946848829, trigger=click)
2026-04-28T17:18:59.164878Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3302386423956492591, trigger=click)
2026-04-28T17:19:41.104295Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3302386423956492591, trigger=visual_change)
2026-04-28T17:21:03.299035Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=1.689362708s
2026-04-28T17:21:52.490456Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4085796735682377830, trigger=visual_change)
2026-04-28T17:22:50.204657Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5154540507509216989, trigger=click)
tip: get the screenpipe desktop app for the full experience
https://screenpi.pe
2026-04-28T17:23:14.691712Z WARN sqlx::query: summary="PRAGMA wal_checkpoint(TRUNCATE)" db.statement="" rows_affected=0 rows_returned=1 elapsed=5.316957667s
2026-04-28T17:23:14.705751Z WARN screenpipe_db::db: wal checkpoint: busy (could not truncate), 358 pages in WAL
2026-04-28T17:23:14.732610Z WARN sqlx::query: summary="BEGIN IMMEDIATE" db.statement="" rows_affected=1 rows_returned=0 elapsed=2.276639s
2026-04-28T17:23:14.953280Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=2.135656625s
2026-04-28T17:23:17.000358Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=32621934252632853, trigger=click)
2026-04-28T17:23:18.870480Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=63 elapsed=17.872300875s
2026-04-28T17:23:18.870810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 63 eligible frames
2026-04-28T17:23:24.674735Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 4.4MB → 1.6MB (2.7x), 27 JPEGs deleted
2026-04-28T17:23:30.134096Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 34 frames, 6.0MB → 2.6MB (2.3x), 34 JPEGs deleted
2026-04-28T17:23:47.062619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)
2026-04-28T17:23:47.660094Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=visual_change)
2026-04-28T17:24:26.590876Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=visual_change)
2026-04-28T17:24:35.057777Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)
2026-04-28T17:24:36.251095Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=visual_change)
2026-04-28T17:24:39.405376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=visual_change)
2026-04-28T17:24:53.019411Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)
2026-04-28T17:25:14.348055Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=click)
2026-04-28T17:25:30.864453Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=click)
2026-04-28T17:25:31.625221Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)
2026-04-28T17:27:39.084601Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)
2026-04-28T17:27:46.115702Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-04-28T17:28:43.734362Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=1.59602225s
2026-04-28T17:28:52.344071Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=61 elapsed=22.19854525s
2026-04-28T17:28:52.344502Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 61 eligible frames
2026-04-28T17:29:01.211744Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 31 frames, 5.3MB → 1.9MB (2.7x), 31 JPEGs deleted
2026-04-28T17:29:11.576322Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 28 frames, 5.0MB → 3.2MB (1.6x), 28 JPEGs deleted
2026-04-28T17:30:06.736879Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8813990094162065370, trigger=visual_change)
2026-04-28T17:31:16.370446Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)
2026-04-28T17:31:17.489267Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)
2026-04-28T17:31:24.338365Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)
2026-04-28T17:31:49.223910Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)
2026-04-28T17:31:55.489490Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)
2026-04-28T17:31:57.951399Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=visual_change)
2026-04-28T17:31:58.927289Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)
2026-04-28T17:32:02.151996Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)
2026-04-28T17:32:02.752775Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)
2026-04-28T17:32:05.672044Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)
2026-04-28T17:32:10.766730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)
2026-04-28T17:32:11.767270Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)
2026-04-28T17:32:14.898520Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)
2026-04-28T17:32:30.033898Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)
2026-04-28T17:32:36.337641Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)
2026-04-28T17:32:42.601724Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)
2026-04-28T17:32:49.882686Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)
2026-04-28T17:32:52.871340Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)
tip: install a starter bundle of pipes:
screenpipe install https://screenpi.pe/start.json
2026-04-28T17:33:20.872909Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)
2026-04-28T17:34:33.267284Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=2.737059125s
2026-04-28T17:34:35.268208Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=50 elapsed=23.676462709s
2026-04-28T17:34:35.269171Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 50 eligible frames
2026-04-28T17:34:40.919221Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)
2026-04-28T17:34:43.456560Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 23 frames, 3.8MB → 1.3MB (2.9x), 23 JPEGs deleted
2026-04-28T17:34:49.828980Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.8MB → 1.5MB (3.2x), 25 JPEGs deleted
2026-04-28T17:34:51.319224Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)
2026-04-28T17:37:53.608170Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=1.446908208s
tip: sign in for higher AI quotas + cloud sync:
screenpipe login
2026-04-28T17:38:38.976168Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-844953656408637404, trigger=visual_change)
2026-04-28T17:38:45.388397Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-844953656408637404, trigger=visual_change)
2026-04-28T17:38:54.425051Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7805582611831809135, trigger=visual_change)
2026-04-28T17:40:08.683806Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=53 elapsed=18.758745375s
2026-04-28T17:40:08.684515Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 53 eligible frames
2026-04-28T17:40:08.720339Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=1.41316125s
2026-04-28T17:40:14.527057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 4.4MB → 1.8MB (2.5x), 27 JPEGs deleted
2026-04-28T17:40:19.017809Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 5.0MB → 1.7MB (3.0x), 24 JPEGs deleted
2026-04-28T17:40:45.760291Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-1920675205105101407, trigger=click)
tip: get the screenpipe desktop app for the full experience
https://screenpi.pe
2026-04-28T17:44:44.523433Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6005834167210030885, trigger=click)
2026-04-28T17:45:36.046790Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=2.354551584s
2026-04-28T17:45:48.797258Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=35 elapsed=29.080941084s
2026-04-28T17:45:48.797852Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 35 eligible frames
2026-04-28T17:45:52.808293Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 2.8MB → 1.1MB (2.6x), 17 JPEGs deleted
2026-04-28T17:45:56.267588Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 16 frames, 2.9MB → 0.9MB (3.2x), 16 JPEGs deleted
2026-04-28T17:45:59.734072Z WARN sqlx::query: summary="BEGIN IMMEDIATE" db.statement="" rows_affected=1 rows_returned=0 elapsed=2.43974075s
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-04-28T17:48:11.307977Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-310266387443272529, trigger=click)
2026-04-28T17:50:06.399275Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=215 elapsed=1.493682625s
2026-04-28T17:51:22.688798Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=43 elapsed=26.391488834s
2026-04-28T17:51:22.690714Z INFO screenpipe_engine::snapshot_compaction: snapshot co...
|
NULL
|
NULL
|
|
95059
|
NULL
|
0
|
2026-04-28T19:23:18.730689+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-28/1777 /Users/lukas/.screenpipe/data/data/2026-04-28/1777404198730_m1.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
/Users/lukas/.screenpipe/data/data/2026-04-28/1777 /Users/lukas/.screenpipe/data/data/2026-04-28/1777404198730_m1.jpg...
|
2026-04-28T16:07:03.361935Z INFO screenpipe_engin 2026-04-28T16:07:03.361935Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:04.884403Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:05.202177Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:07.123899Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:08.584617Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:09.975643Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:10.221917Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:11.235748Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:11.573033Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:12.720817Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:13.085300Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:13.983235Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:15.315623Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:15.679709Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:16.294399Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:17.469168Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:17.704892Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:18.327350Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:18.584089Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:19.383211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:19.697209Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:20.683739Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:22.590735Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:23.502612Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:23.740842Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:24.632559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:24.961958Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:25.589407Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:30.159089Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:30.378744Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:34.788508Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:35.112244Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:35.943249Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:36.843570Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:37.166993Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:38.233737Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:42.733209Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:42.962402Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:44.443847Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:44.753972Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:57.769188Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:07:58.113833Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-04-28T16:08:32.137779Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:08:34.603773Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:08:34.932275Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:08:36.780956Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=89 elapsed=11.844145s
2026-04-28T16:08:36.781045Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 89 eligible frames
2026-04-28T16:08:40.099262Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 43 frames, 16.5MB → 0.6MB (26.1x), 43 JPEGs deleted
2026-04-28T16:08:42.789812Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 44 frames, 7.7MB → 0.3MB (29.9x), 44 JPEGs deleted
2026-04-28T16:08:47.816306Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:08:48.080973Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:08:49.055512Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:09:14.695030Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:09:14.946613Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:11:42.049193Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:11:42.534314Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:11:52.738708Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:11:53.064036Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:11:59.869884Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:12:00.215936Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:12:06.911557Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5781189571662577813, trigger=click)
2026-04-28T16:12:07.093383Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5781189571662577813, trigger=click)
2026-04-28T16:12:20.806166Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:21.032640Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:23.043723Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:23.369330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:25.662585Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:26.285107Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:27.289159Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:30.909210Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:31.157616Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:34.265113Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:34.507077Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
tip: install a starter bundle of pipes:
screenpipe install https://screenpi.pe/start.json
2026-04-28T16:13:54.410986Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=81 elapsed=11.608799667s
2026-04-28T16:13:54.411842Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 81 eligible frames
2026-04-28T16:13:57.167507Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 15.7MB → 0.6MB (24.9x), 41 JPEGs deleted
2026-04-28T16:13:59.574102Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 6.6MB → 0.3MB (25.9x), 38 JPEGs deleted
2026-04-28T16:14:05.617758Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:14:30.003264Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4871134950740386536, trigger=click)
2026-04-28T16:14:30.266331Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4871134950740386536, trigger=click)
2026-04-28T16:14:36.255363Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=9092815945908542616, trigger=click)
2026-04-28T16:14:36.548566Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=9092815945908542616, trigger=click)
tip: sign in for higher AI quotas + cloud sync:
screenpipe login
2026-04-28T16:19:08.931864Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=178 elapsed=1.132447167s
2026-04-28T16:19:11.931756Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=76 elapsed=12.367092209s
2026-04-28T16:19:11.931987Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 76 eligible frames
2026-04-28T16:19:15.012481Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 37 frames, 14.2MB → 0.6MB (22.5x), 37 JPEGs deleted
2026-04-28T16:19:17.554472Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 37 frames, 6.5MB → 0.3MB (25.2x), 37 JPEGs deleted
tip: get the screenpipe desktop app for the full experience
https://screenpi.pe
2026-04-28T16:24:27.038545Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=178 elapsed=1.000578959s
2026-04-28T16:24:29.034280Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=46 elapsed=11.139412958s
2026-04-28T16:24:29.035034Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames
2026-04-28T16:24:30.963871Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 23 frames, 8.8MB → 0.6MB (14.0x), 23 JPEGs deleted
2026-04-28T16:24:32.350677Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.7MB → 0.3MB (14.4x), 21 JPEGs deleted
2026-04-28T16:26:09.542993Z INFO screenpipe_engine::sleep_monitor: Screen locked (CGSession safety-net poll)
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-04-28T16:29:43.556469Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=43 elapsed=11.198770125s
2026-04-28T16:29:43.556550Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 43 eligible frames
2026-04-28T16:29:44.986491Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 8.1MB → 0.6MB (12.8x), 21 JPEGs deleted
2026-04-28T16:29:46.268687Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 20 frames, 3.5MB → 0.3MB (13.8x), 20 JPEGs deleted
tip: install a starter bundle of pipes:
screenpipe install https://screenpi.pe/start.json
2026-04-28T16:34:57.128232Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=24 elapsed=10.763956s
2026-04-28T16:34:57.128230Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=178 elapsed=1.4624175s
2026-04-28T16:34:57.131408Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 24 eligible frames
2026-04-28T16:34:58.083167Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 4.2MB → 0.6MB (6.7x), 11 JPEGs deleted
2026-04-28T16:34:58.887644Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 1.9MB → 0.3MB (7.6x), 11 JPEGs deleted
tip: sign in for higher AI quotas + cloud sync:
screenpipe login
2026-04-28T16:40:09.584894Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=6 elapsed=10.685695125s
2026-04-28T16:40:09.587850Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 6 eligible frames
2026-04-28T16:40:10.068260Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 2 frames, 0.8MB → 0.6MB (1.3x), 2 JPEGs deleted
2026-04-28T16:40:10.414309Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 2 frames, 0.3MB → 0.2MB (1.6x), 2 JPEGs deleted
tip: get the screenpipe desktop app for the full experience
https://screenpi.pe
2026-04-28T16:45:21.393195Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=2 elapsed=10.966809042s
2026-04-28T16:45:21.393281Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 2 eligible frames
2026-04-28T16:46:56.332846Z INFO screenpipe_engine::sleep_monitor: Screen unlocked (CGSession safety-net poll)
2026-04-28T16:46:56.334007Z INFO screenpipe_engine::event_driven_capture: invalidating persistent streams after unlock/wake for monitor 2
2026-04-28T16:46:56.352112Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
2026-04-28T16:46:58.304757Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)
2026-04-28T16:46:58.565809Z WARN screenpipe_engine::event_driven_capture: skipping capture: lock screen app 'loginwindow' on monitor 1
2026-04-28T16:46:58.897766Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)
2026-04-28T16:46:59.184093Z WARN screenpipe_engine::event_driven_capture: skipping capture: lock screen app 'loginwindow' on monitor 2
2026-04-28T16:47:01.338502Z INFO screenpipe_engine::sleep_monitor: Screen unlocked (CGSession safety-net poll)
2026-04-28T16:47:01.390301Z INFO screenpipe_engine::event_driven_capture: invalidating persistent streams after unlock/wake for monitor 2
2026-04-28T16:47:02.630076Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
2026-04-28T16:47:05.728990Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)
2026-04-28T16:47:07.623977Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)
2026-04-28T16:47:28.943957Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=179 elapsed=2.634386708s
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-04-28T16:50:17.222019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6216647555668337619, trigger=click)
2026-04-28T16:50:35.797720Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=0 elapsed=14.383813625s
2026-04-28T16:51:42.581111Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7104241776089826277, trigger=click)
2026-04-28T16:51:44.019608Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7104241776089826277, trigger=click)
2026-04-28T16:53:08.025195Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6139761258158646866, trigger=click)
tip: install a starter bundle of pipes:
screenpipe install https://screenpi.pe/start.json
2026-04-28T16:53:53.588281Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3939156275097735830, trigger=click)
2026-04-28T16:55:49.235703Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=0 elapsed=12.968643708s
2026-04-28T16:57:04.416388Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8581538536659125863, trigger=click)
2026-04-28T16:57:12.492178Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8581538536659125863, trigger=click)
2026-04-28T16:57:12.841981Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8581538536659125863, trigger=click)
2026-04-28T16:57:14.415251Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8581538536659125863, trigger=visual_change)
2026-04-28T16:57:14.726963Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8581538536659125863, trigger=click)
2026-04-28T16:57:17.407196Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8581538536659125863, trigger=visual_change)
tip: sign in for higher AI quotas + cloud sync:
screenpipe login
2026-04-28T17:00:57.997500Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=196 elapsed=2.082627917s
2026-04-28T17:01:14.953984Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=37 elapsed=24.41720925s
2026-04-28T17:01:14.966099Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 37 eligible frames
2026-04-28T17:01:17.943398Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 3.3MB → 0.4MB (8.8x), 18 JPEGs deleted
2026-04-28T17:01:22.631343Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 2.9MB → 1.1MB (2.5x), 19 JPEGs deleted
2026-04-28T17:01:33.886858Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=197 elapsed=1.1513605s
2026-04-28T17:01:35.848522Z INFO screenpipe_engine::meeting_detector: meeting v2: Idle -> Confirming (app=Firefox, signals=2)
2026-04-28T17:01:41.903090Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=197 elapsed=1.052568042s
2026-04-28T17:01:45.412020Z INFO screenpipe_engine::meeting_detector: meeting v2: Confirming -> Active (app=Firefox, signals=2, browser=true)
2026-04-28T17:01:46.211477Z INFO screenpipe_engine::meeting_detector: meeting v2: meeting started (id=18, app=Firefox, title=None)
2026-04-28T17:02:53.351145Z WARN sqlx::query: summary="COMMIT" db.statement="" rows_affected=1 rows_returned=0 elapsed=1.195813541s
tip: get the screenpipe desktop app for the full experience
https://screenpi.pe
2026-04-28T17:04:32.492320Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)
2026-04-28T17:04:40.831992Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)
2026-04-28T17:05:19.749943Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=520550632255337786, trigger=visual_change)
2026-04-28T17:06:36.762718Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8913262551050344622, trigger=click)
2026-04-28T17:06:37.394423Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8913262551050344622, trigger=click)
2026-04-28T17:06:38.571150Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=78 elapsed=15.889136334s
2026-04-28T17:06:38.571330Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 78 eligible frames
2026-04-28T17:06:41.727150Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 36 frames, 8.7MB → 1.5MB (5.7x), 36 JPEGs deleted
2026-04-28T17:06:47.337599Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 6.3MB → 2.8MB (2.2x), 40 JPEGs deleted
2026-04-28T17:07:35.259124Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=203 elapsed=1.296070334s
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-04-28T17:11:54.187082Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=209 elapsed=1.028743583s
2026-04-28T17:11:57.308650Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8297064725994209049, trigger=visual_change)
2026-04-28T17:12:03.975962Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=97 elapsed=16.608343459s
2026-04-28T17:12:03.980035Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 97 eligible frames
2026-04-28T17:12:09.423715Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 8.8MB → 1.3MB (7.0x), 38 JPEGs deleted
2026-04-28T17:12:18.745568Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 57 frames, 9.2MB → 5.1MB (1.8x), 57 JPEGs deleted
2026-04-28T17:12:28.910725Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8297064725994209049, trigger=click)
2026-04-28T17:12:47.242180Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=210 elapsed=1.053630416s
2026-04-28T17:12:50.549067Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7463698365302281039, trigger=click)
tip: install a starter bundle of pipes:
screenpipe install https://screenpi.pe/start.json
2026-04-28T17:13:10.200772Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5154540507509216989, trigger=click)
2026-04-28T17:13:10.768365Z WARN sqlx::query: summary="PRAGMA wal_checkpoint(TRUNCATE)" db.statement="" rows_affected=0 rows_returned=1 elapsed=1.391680292s
2026-04-28T17:17:32.658004Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=212 elapsed=2.466153666s
2026-04-28T17:17:35.955873Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=app_switch, monitor=1) — DB pool may be saturated
2026-04-28T17:17:44.553826Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=64 elapsed=25.777843041s
2026-04-28T17:17:44.559382Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 64 eligible frames
2026-04-28T17:17:50.399756Z INFO screenpipe_engine::event_driven_capture: monitor 1 capture recovered after 1 consecutive errors
2026-04-28T17:17:50.799123Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 30 frames, 5.2MB → 2.2MB (2.4x), 30 JPEGs deleted
2026-04-28T17:18:01.010642Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 32 frames, 6.5MB → 2.9MB (2.3x), 32 JPEGs deleted
tip: sign in for higher AI quotas + cloud sync:
screenpipe login
2026-04-28T17:18:33.982766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7174140395946848829, trigger=click)
2026-04-28T17:18:59.164878Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3302386423956492591, trigger=click)
2026-04-28T17:19:41.104295Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3302386423956492591, trigger=visual_change)
2026-04-28T17:21:03.299035Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=1.689362708s
2026-04-28T17:21:52.490456Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4085796735682377830, trigger=visual_change)
2026-04-28T17:22:50.204657Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5154540507509216989, trigger=click)
tip: get the screenpipe desktop app for the full experience
https://screenpi.pe
2026-04-28T17:23:14.691712Z WARN sqlx::query: summary="PRAGMA wal_checkpoint(TRUNCATE)" db.statement="" rows_affected=0 rows_returned=1 elapsed=5.316957667s
2026-04-28T17:23:14.705751Z WARN screenpipe_db::db: wal checkpoint: busy (could not truncate), 358 pages in WAL
2026-04-28T17:23:14.732610Z WARN sqlx::query: summary="BEGIN IMMEDIATE" db.statement="" rows_affected=1 rows_returned=0 elapsed=2.276639s
2026-04-28T17:23:14.953280Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=2.135656625s
2026-04-28T17:23:17.000358Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=32621934252632853, trigger=click)
2026-04-28T17:23:18.870480Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=63 elapsed=17.872300875s
2026-04-28T17:23:18.870810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 63 eligible frames
2026-04-28T17:23:24.674735Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 4.4MB → 1.6MB (2.7x), 27 JPEGs deleted
2026-04-28T17:23:30.134096Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 34 frames, 6.0MB → 2.6MB (2.3x), 34 JPEGs deleted
2026-04-28T17:23:47.062619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)
2026-04-28T17:23:47.660094Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=visual_change)
2026-04-28T17:24:26.590876Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=visual_change)
2026-04-28T17:24:35.057777Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)
2026-04-28T17:24:36.251095Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=visual_change)
2026-04-28T17:24:39.405376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=visual_change)
2026-04-28T17:24:53.019411Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)
2026-04-28T17:25:14.348055Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=click)
2026-04-28T17:25:30.864453Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=click)
2026-04-28T17:25:31.625221Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)
2026-04-28T17:27:39.084601Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)
2026-04-28T17:27:46.115702Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-04-28T17:28:43.734362Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=1.59602225s
2026-04-28T17:28:52.344071Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=61 elapsed=22.19854525s
2026-04-28T17:28:52.344502Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 61 eligible frames
2026-04-28T17:29:01.211744Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 31 frames, 5.3MB → 1.9MB (2.7x), 31 JPEGs deleted
2026-04-28T17:29:11.576322Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 28 frames, 5.0MB → 3.2MB (1.6x), 28 JPEGs deleted
2026-04-28T17:30:06.736879Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8813990094162065370, trigger=visual_change)
2026-04-28T17:31:16.370446Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)
2026-04-28T17:31:17.489267Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)
2026-04-28T17:31:24.338365Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)
2026-04-28T17:31:49.223910Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)
2026-04-28T17:31:55.489490Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)
2026-04-28T17:31:57.951399Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=visual_change)
2026-04-28T17:31:58.927289Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)
2026-04-28T17:32:02.151996Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)
2026-04-28T17:32:02.752775Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)
2026-04-28T17:32:05.672044Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)
2026-04-28T17:32:10.766730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)
2026-04-28T17:32:11.767270Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)
2026-04-28T17:32:14.898520Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)
2026-04-28T17:32:30.033898Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)
2026-04-28T17:32:36.337641Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)
2026-04-28T17:32:42.601724Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)
2026-04-28T17:32:49.882686Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)
2026-04-28T17:32:52.871340Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)
tip: install a starter bundle of pipes:
screenpipe install https://screenpi.pe/start.json
2026-04-28T17:33:20.872909Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)
2026-04-28T17:34:33.267284Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=2.737059125s
2026-04-28T17:34:35.268208Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=50 elapsed=23.676462709s
2026-04-28T17:34:35.269171Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 50 eligible frames
2026-04-28T17:34:40.919221Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)
2026-04-28T17:34:43.456560Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 23 frames, 3.8MB → 1.3MB (2.9x), 23 JPEGs deleted
2026-04-28T17:34:49.828980Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.8MB → 1.5MB (3.2x), 25 JPEGs deleted
2026-04-28T17:34:51.319224Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)
2026-04-28T17:37:53.608170Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=1.446908208s
tip: sign in for higher AI quotas + cloud sync:
screenpipe login
2026-04-28T17:38:38.976168Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-844953656408637404, trigger=visual_change)
2026-04-28T17:38:45.388397Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-844953656408637404, trigger=visual_change)
2026-04-28T17:38:54.425051Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7805582611831809135, trigger=visual_change)
2026-04-28T17:40:08.683806Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=53 elapsed=18.758745375s
2026-04-28T17:40:08.684515Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 53 eligible frames
2026-04-28T17:40:08.720339Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=1.41316125s
2026-04-28T17:40:14.527057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 4.4MB → 1.8MB (2.5x), 27 JPEGs deleted
2026-04-28T17:40:19.017809Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 5.0MB → 1.7MB (3.0x), 24 JPEGs deleted
2026-04-28T17:40:45.760291Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-1920675205105101407, trigger=click)
tip: get the screenpipe desktop app for the full experience
https://screenpi.pe
2026-04-28T17:44:44.523433Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6005834167210030885, trigger=click)
2026-04-28T17:45:36.046790Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=2.354551584s
2026-04-28T17:45:48.797258Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=35 elapsed=29.080941084s
2026-04-28T17:45:48.797852Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 35 eligible frames
2026-04-28T17:45:52.808293Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 2.8MB → 1.1MB (2.6x), 17 JPEGs deleted
2026-04-28T17:45:56.267588Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 16 frames, 2.9MB → 0.9MB (3.2x), 16 JPEGs deleted
2026-04-28T17:45:59.734072Z WARN sqlx::query: summary="BEGIN IMMEDIATE" db.statement="" rows_affected=1 rows_returned=0 elapsed=2.43974075s
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-04-28T17:48:11.307977Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-310266387443272529, trigger=click)
2026-04-28T17:50:06.399275Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=215 elapsed=1.493682625s
2026-04-28T17:51:22.688798Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=43 elapsed=26.391488834s
2026-04-28T17:51:22.690714Z INFO screenpipe_engine::snapshot_compaction: snapshot co...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"2026-04-28T16:07:03.361935Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:04.884403Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:05.202177Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:07.123899Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:08.584617Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:09.975643Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:10.221917Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:11.235748Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:11.573033Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:12.720817Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:13.085300Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:13.983235Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:15.315623Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:15.679709Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:16.294399Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:17.469168Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:17.704892Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:18.327350Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:18.584089Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:19.383211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:19.697209Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:20.683739Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:22.590735Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:23.502612Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:23.740842Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:24.632559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:24.961958Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:25.589407Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:30.159089Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:30.378744Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:34.788508Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:35.112244Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:35.943249Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:36.843570Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:37.166993Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:38.233737Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:42.733209Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:42.962402Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:44.443847Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:44.753972Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:57.769188Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:07:58.113833Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T16:08:32.137779Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:08:34.603773Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:08:34.932275Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:08:36.780956Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=89 elapsed=11.844145s\n2026-04-28T16:08:36.781045Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 89 eligible frames\n2026-04-28T16:08:40.099262Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 43 frames, 16.5MB → 0.6MB (26.1x), 43 JPEGs deleted\n2026-04-28T16:08:42.789812Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 44 frames, 7.7MB → 0.3MB (29.9x), 44 JPEGs deleted\n2026-04-28T16:08:47.816306Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:08:48.080973Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:08:49.055512Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:09:14.695030Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:09:14.946613Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:11:42.049193Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:11:42.534314Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:11:52.738708Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:11:53.064036Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:11:59.869884Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:12:00.215936Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:12:06.911557Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5781189571662577813, trigger=click)\n2026-04-28T16:12:07.093383Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5781189571662577813, trigger=click)\n2026-04-28T16:12:20.806166Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:21.032640Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:23.043723Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:23.369330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:25.662585Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:26.285107Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:27.289159Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:30.909210Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:31.157616Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:34.265113Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:34.507077Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T16:13:54.410986Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=81 elapsed=11.608799667s\n2026-04-28T16:13:54.411842Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 81 eligible frames\n2026-04-28T16:13:57.167507Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 15.7MB → 0.6MB (24.9x), 41 JPEGs deleted\n2026-04-28T16:13:59.574102Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 6.6MB → 0.3MB (25.9x), 38 JPEGs deleted\n2026-04-28T16:14:05.617758Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:14:30.003264Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4871134950740386536, trigger=click)\n2026-04-28T16:14:30.266331Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4871134950740386536, trigger=click)\n2026-04-28T16:14:36.255363Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=9092815945908542616, trigger=click)\n2026-04-28T16:14:36.548566Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=9092815945908542616, trigger=click)\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T16:19:08.931864Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=178 elapsed=1.132447167s\n2026-04-28T16:19:11.931756Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=76 elapsed=12.367092209s\n2026-04-28T16:19:11.931987Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 76 eligible frames\n2026-04-28T16:19:15.012481Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 37 frames, 14.2MB → 0.6MB (22.5x), 37 JPEGs deleted\n2026-04-28T16:19:17.554472Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 37 frames, 6.5MB → 0.3MB (25.2x), 37 JPEGs deleted\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T16:24:27.038545Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=178 elapsed=1.000578959s\n2026-04-28T16:24:29.034280Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=11.139412958s\n2026-04-28T16:24:29.035034Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-28T16:24:30.963871Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 23 frames, 8.8MB → 0.6MB (14.0x), 23 JPEGs deleted\n2026-04-28T16:24:32.350677Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.7MB → 0.3MB (14.4x), 21 JPEGs deleted\n2026-04-28T16:26:09.542993Z INFO screenpipe_engine::sleep_monitor: Screen locked (CGSession safety-net poll)\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T16:29:43.556469Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=43 elapsed=11.198770125s\n2026-04-28T16:29:43.556550Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 43 eligible frames\n2026-04-28T16:29:44.986491Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 8.1MB → 0.6MB (12.8x), 21 JPEGs deleted\n2026-04-28T16:29:46.268687Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 20 frames, 3.5MB → 0.3MB (13.8x), 20 JPEGs deleted\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T16:34:57.128232Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=24 elapsed=10.763956s\n2026-04-28T16:34:57.128230Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=178 elapsed=1.4624175s\n2026-04-28T16:34:57.131408Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 24 eligible frames\n2026-04-28T16:34:58.083167Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 4.2MB → 0.6MB (6.7x), 11 JPEGs deleted\n2026-04-28T16:34:58.887644Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 1.9MB → 0.3MB (7.6x), 11 JPEGs deleted\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T16:40:09.584894Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=6 elapsed=10.685695125s\n2026-04-28T16:40:09.587850Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 6 eligible frames\n2026-04-28T16:40:10.068260Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 2 frames, 0.8MB → 0.6MB (1.3x), 2 JPEGs deleted\n2026-04-28T16:40:10.414309Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 2 frames, 0.3MB → 0.2MB (1.6x), 2 JPEGs deleted\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T16:45:21.393195Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=2 elapsed=10.966809042s\n2026-04-28T16:45:21.393281Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 2 eligible frames\n2026-04-28T16:46:56.332846Z INFO screenpipe_engine::sleep_monitor: Screen unlocked (CGSession safety-net poll)\n2026-04-28T16:46:56.334007Z INFO screenpipe_engine::event_driven_capture: invalidating persistent streams after unlock/wake for monitor 2\n2026-04-28T16:46:56.352112Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\n2026-04-28T16:46:58.304757Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-28T16:46:58.565809Z WARN screenpipe_engine::event_driven_capture: skipping capture: lock screen app 'loginwindow' on monitor 1\n2026-04-28T16:46:58.897766Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-28T16:46:59.184093Z WARN screenpipe_engine::event_driven_capture: skipping capture: lock screen app 'loginwindow' on monitor 2\n2026-04-28T16:47:01.338502Z INFO screenpipe_engine::sleep_monitor: Screen unlocked (CGSession safety-net poll)\n2026-04-28T16:47:01.390301Z INFO screenpipe_engine::event_driven_capture: invalidating persistent streams after unlock/wake for monitor 2\n2026-04-28T16:47:02.630076Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\n2026-04-28T16:47:05.728990Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-28T16:47:07.623977Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-28T16:47:28.943957Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=179 elapsed=2.634386708s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T16:50:17.222019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6216647555668337619, trigger=click)\n2026-04-28T16:50:35.797720Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=14.383813625s\n2026-04-28T16:51:42.581111Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7104241776089826277, trigger=click)\n2026-04-28T16:51:44.019608Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7104241776089826277, trigger=click)\n2026-04-28T16:53:08.025195Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6139761258158646866, trigger=click)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T16:53:53.588281Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3939156275097735830, trigger=click)\n2026-04-28T16:55:49.235703Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.968643708s\n2026-04-28T16:57:04.416388Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8581538536659125863, trigger=click)\n2026-04-28T16:57:12.492178Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8581538536659125863, trigger=click)\n2026-04-28T16:57:12.841981Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8581538536659125863, trigger=click)\n2026-04-28T16:57:14.415251Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8581538536659125863, trigger=visual_change)\n2026-04-28T16:57:14.726963Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8581538536659125863, trigger=click)\n2026-04-28T16:57:17.407196Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8581538536659125863, trigger=visual_change)\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T17:00:57.997500Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=196 elapsed=2.082627917s\n2026-04-28T17:01:14.953984Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=37 elapsed=24.41720925s\n2026-04-28T17:01:14.966099Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 37 eligible frames\n2026-04-28T17:01:17.943398Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 3.3MB → 0.4MB (8.8x), 18 JPEGs deleted\n2026-04-28T17:01:22.631343Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 2.9MB → 1.1MB (2.5x), 19 JPEGs deleted\n2026-04-28T17:01:33.886858Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=197 elapsed=1.1513605s\n2026-04-28T17:01:35.848522Z INFO screenpipe_engine::meeting_detector: meeting v2: Idle -> Confirming (app=Firefox, signals=2)\n2026-04-28T17:01:41.903090Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=197 elapsed=1.052568042s\n2026-04-28T17:01:45.412020Z INFO screenpipe_engine::meeting_detector: meeting v2: Confirming -> Active (app=Firefox, signals=2, browser=true)\n2026-04-28T17:01:46.211477Z INFO screenpipe_engine::meeting_detector: meeting v2: meeting started (id=18, app=Firefox, title=None)\n2026-04-28T17:02:53.351145Z WARN sqlx::query: summary=\"COMMIT\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=1.195813541s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T17:04:32.492320Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T17:04:40.831992Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)\n2026-04-28T17:05:19.749943Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=520550632255337786, trigger=visual_change)\n2026-04-28T17:06:36.762718Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8913262551050344622, trigger=click)\n2026-04-28T17:06:37.394423Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8913262551050344622, trigger=click)\n2026-04-28T17:06:38.571150Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=78 elapsed=15.889136334s\n2026-04-28T17:06:38.571330Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 78 eligible frames\n2026-04-28T17:06:41.727150Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 36 frames, 8.7MB → 1.5MB (5.7x), 36 JPEGs deleted\n2026-04-28T17:06:47.337599Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 6.3MB → 2.8MB (2.2x), 40 JPEGs deleted\n2026-04-28T17:07:35.259124Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=203 elapsed=1.296070334s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T17:11:54.187082Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=209 elapsed=1.028743583s\n2026-04-28T17:11:57.308650Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8297064725994209049, trigger=visual_change)\n2026-04-28T17:12:03.975962Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=97 elapsed=16.608343459s\n2026-04-28T17:12:03.980035Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 97 eligible frames\n2026-04-28T17:12:09.423715Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 8.8MB → 1.3MB (7.0x), 38 JPEGs deleted\n2026-04-28T17:12:18.745568Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 57 frames, 9.2MB → 5.1MB (1.8x), 57 JPEGs deleted\n2026-04-28T17:12:28.910725Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8297064725994209049, trigger=click)\n2026-04-28T17:12:47.242180Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=210 elapsed=1.053630416s\n2026-04-28T17:12:50.549067Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7463698365302281039, trigger=click)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T17:13:10.200772Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5154540507509216989, trigger=click)\n2026-04-28T17:13:10.768365Z WARN sqlx::query: summary=\"PRAGMA wal_checkpoint(TRUNCATE)\" db.statement=\"\" rows_affected=0 rows_returned=1 elapsed=1.391680292s\n2026-04-28T17:17:32.658004Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=212 elapsed=2.466153666s\n2026-04-28T17:17:35.955873Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=app_switch, monitor=1) — DB pool may be saturated\n2026-04-28T17:17:44.553826Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=64 elapsed=25.777843041s\n2026-04-28T17:17:44.559382Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 64 eligible frames\n2026-04-28T17:17:50.399756Z INFO screenpipe_engine::event_driven_capture: monitor 1 capture recovered after 1 consecutive errors\n2026-04-28T17:17:50.799123Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 30 frames, 5.2MB → 2.2MB (2.4x), 30 JPEGs deleted\n2026-04-28T17:18:01.010642Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 32 frames, 6.5MB → 2.9MB (2.3x), 32 JPEGs deleted\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T17:18:33.982766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7174140395946848829, trigger=click)\n2026-04-28T17:18:59.164878Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3302386423956492591, trigger=click)\n2026-04-28T17:19:41.104295Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3302386423956492591, trigger=visual_change)\n2026-04-28T17:21:03.299035Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=1.689362708s\n2026-04-28T17:21:52.490456Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4085796735682377830, trigger=visual_change)\n2026-04-28T17:22:50.204657Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5154540507509216989, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T17:23:14.691712Z WARN sqlx::query: summary=\"PRAGMA wal_checkpoint(TRUNCATE)\" db.statement=\"\" rows_affected=0 rows_returned=1 elapsed=5.316957667s\n2026-04-28T17:23:14.705751Z WARN screenpipe_db::db: wal checkpoint: busy (could not truncate), 358 pages in WAL\n2026-04-28T17:23:14.732610Z WARN sqlx::query: summary=\"BEGIN IMMEDIATE\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=2.276639s\n2026-04-28T17:23:14.953280Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=2.135656625s\n2026-04-28T17:23:17.000358Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=32621934252632853, trigger=click)\n2026-04-28T17:23:18.870480Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=63 elapsed=17.872300875s\n2026-04-28T17:23:18.870810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 63 eligible frames\n2026-04-28T17:23:24.674735Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 4.4MB → 1.6MB (2.7x), 27 JPEGs deleted\n2026-04-28T17:23:30.134096Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 34 frames, 6.0MB → 2.6MB (2.3x), 34 JPEGs deleted\n2026-04-28T17:23:47.062619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)\n2026-04-28T17:23:47.660094Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=visual_change)\n2026-04-28T17:24:26.590876Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=visual_change)\n2026-04-28T17:24:35.057777Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)\n2026-04-28T17:24:36.251095Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=visual_change)\n2026-04-28T17:24:39.405376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=visual_change)\n2026-04-28T17:24:53.019411Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)\n2026-04-28T17:25:14.348055Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=click)\n2026-04-28T17:25:30.864453Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=click)\n2026-04-28T17:25:31.625221Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)\n2026-04-28T17:27:39.084601Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T17:27:46.115702Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T17:28:43.734362Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=1.59602225s\n2026-04-28T17:28:52.344071Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=61 elapsed=22.19854525s\n2026-04-28T17:28:52.344502Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 61 eligible frames\n2026-04-28T17:29:01.211744Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 31 frames, 5.3MB → 1.9MB (2.7x), 31 JPEGs deleted\n2026-04-28T17:29:11.576322Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 28 frames, 5.0MB → 3.2MB (1.6x), 28 JPEGs deleted\n2026-04-28T17:30:06.736879Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8813990094162065370, trigger=visual_change)\n2026-04-28T17:31:16.370446Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:31:17.489267Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:31:24.338365Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)\n2026-04-28T17:31:49.223910Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)\n2026-04-28T17:31:55.489490Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)\n2026-04-28T17:31:57.951399Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=visual_change)\n2026-04-28T17:31:58.927289Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:32:02.151996Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:32:02.752775Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:32:05.672044Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:32:10.766730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:32:11.767270Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:32:14.898520Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)\n2026-04-28T17:32:30.033898Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)\n2026-04-28T17:32:36.337641Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)\n2026-04-28T17:32:42.601724Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)\n2026-04-28T17:32:49.882686Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)\n2026-04-28T17:32:52.871340Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T17:33:20.872909Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)\n2026-04-28T17:34:33.267284Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=2.737059125s\n2026-04-28T17:34:35.268208Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=50 elapsed=23.676462709s\n2026-04-28T17:34:35.269171Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 50 eligible frames\n2026-04-28T17:34:40.919221Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T17:34:43.456560Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 23 frames, 3.8MB → 1.3MB (2.9x), 23 JPEGs deleted\n2026-04-28T17:34:49.828980Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.8MB → 1.5MB (3.2x), 25 JPEGs deleted\n2026-04-28T17:34:51.319224Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)\n2026-04-28T17:37:53.608170Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=1.446908208s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T17:38:38.976168Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-844953656408637404, trigger=visual_change)\n2026-04-28T17:38:45.388397Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-844953656408637404, trigger=visual_change)\n2026-04-28T17:38:54.425051Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7805582611831809135, trigger=visual_change)\n2026-04-28T17:40:08.683806Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=53 elapsed=18.758745375s\n2026-04-28T17:40:08.684515Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 53 eligible frames\n2026-04-28T17:40:08.720339Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=1.41316125s\n2026-04-28T17:40:14.527057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 4.4MB → 1.8MB (2.5x), 27 JPEGs deleted\n2026-04-28T17:40:19.017809Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 5.0MB → 1.7MB (3.0x), 24 JPEGs deleted\n2026-04-28T17:40:45.760291Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-1920675205105101407, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T17:44:44.523433Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6005834167210030885, trigger=click)\n2026-04-28T17:45:36.046790Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=2.354551584s\n2026-04-28T17:45:48.797258Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=35 elapsed=29.080941084s\n2026-04-28T17:45:48.797852Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 35 eligible frames\n2026-04-28T17:45:52.808293Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 2.8MB → 1.1MB (2.6x), 17 JPEGs deleted\n2026-04-28T17:45:56.267588Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 16 frames, 2.9MB → 0.9MB (3.2x), 16 JPEGs deleted\n2026-04-28T17:45:59.734072Z WARN sqlx::query: summary=\"BEGIN IMMEDIATE\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=2.43974075s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T17:48:11.307977Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-310266387443272529, trigger=click)\n2026-04-28T17:50:06.399275Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=215 elapsed=1.493682625s\n2026-04-28T17:51:22.688798Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=43 elapsed=26.391488834s\n2026-04-28T17:51:22.690714Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 43 eligible frames\n2026-04-28T17:51:29.036691Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.6MB → 1.4MB (2.7x), 22 JPEGs deleted\n2026-04-28T17:51:32.222940Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 2.7MB → 0.4MB (6.6x), 19 JPEGs deleted\n2026-04-28T17:52:04.754173Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3769295062857853594, trigger=click)\n2026-04-28T17:52:13.489892Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3769295062857853594, trigger=visual_change)\n2026-04-28T17:52:15.091164Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3769295062857853594, trigger=click)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T17:53:48.873572Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6254911494541167184, trigger=click)\n2026-04-28T17:56:43.964294Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=216 elapsed=1.621008083s\n2026-04-28T17:56:53.860942Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=43 elapsed=21.317519709s\n2026-04-28T17:56:53.861419Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 43 eligible frames\n2026-04-28T17:56:58.615624Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 23 frames, 3.5MB → 1.3MB (2.6x), 23 JPEGs deleted\n2026-04-28T17:57:02.978805Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.7MB → 0.8MB (3.2x), 18 JPEGs deleted\n2026-04-28T17:57:26.396309Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T17:57:32.405615Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T18:01:25.451495Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T18:01:26.059212Z WARN sqlx::query: summary=\"COMMIT\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=2.378852666s\n2026-04-28T18:01:32.813958Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)\n2026-04-28T18:02:22.865372Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=59 elapsed=19.861929375s\n2026-04-28T18:02:22.868572Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 59 eligible frames\n2026-04-28T18:02:28.010325Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 4.4MB → 1.6MB (2.7x), 27 JPEGs deleted\n2026-04-28T18:02:31.034840Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T18:02:35.341581Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 30 frames, 5.4MB → 2.2MB (2.4x), 30 JPEGs deleted\n2026-04-28T18:02:52.414456Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T18:03:22.286014Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T18:06:38.897268Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=225 elapsed=1.272339875s\n2026-04-28T18:06:56.830727Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3059468017859355985, trigger=visual_change)\n2026-04-28T18:07:46.547699Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=226 elapsed=1.289059583s\n2026-04-28T18:07:49.469402Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=73 elapsed=13.809847041s\n2026-04-28T18:07:49.469802Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 73 eligible frames\n2026-04-28T18:07:54.084967Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 36 frames, 6.2MB → 2.3MB (2.7x), 36 JPEGs deleted\n2026-04-28T18:07:58.202315Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 35 frames, 6.5MB → 3.1MB (2.1x), 35 JPEGs deleted\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T18:08:30.182501Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Idle (timeout=300s, app=Firefox, id=18)\n2026-04-28T18:08:31.026260Z INFO screenpipe_engine::meeting_detector: meeting v2: meeting ended (id=18)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T18:13:12.197365Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=57 elapsed=13.981802916s\n2026-04-28T18:13:12.201813Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 57 eligible frames\n2026-04-28T18:13:12.369500Z WARN sqlx::query: summary=\"PRAGMA wal_checkpoint(TRUNCATE)\" db.statement=\"\" rows_affected=0 rows_returned=1 elapsed=2.777140458s\n2026-04-28T18:13:16.080941Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 3.8MB → 1.2MB (3.1x), 24 JPEGs deleted\n2026-04-28T18:13:22.515083Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 31 frames, 5.2MB → 2.0MB (2.6x), 31 JPEGs deleted\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T18:18:45.389294Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=72 elapsed=22.856535958s\n2026-04-28T18:18:45.394002Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 72 eligible frames\n2026-04-28T18:18:45.477022Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=245 elapsed=1.363011375s\n2026-04-28T18:18:52.269655Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 32 frames, 7.9MB → 1.3MB (5.9x), 32 JPEGs deleted\n2026-04-28T18:19:00.406515Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 6.1MB → 2.3MB (2.6x), 38 JPEGs deleted\n2026-04-28T18:21:03.916795Z WARN sqlx::query: summary=\"BEGIN IMMEDIATE\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=1.642808625s\n2026-04-28T18:21:31.158779Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=245 elapsed=1.711686125s\n2026-04-28T18:22:12.801109Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8839231840523050937, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T18:24:16.556243Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=78 elapsed=16.13078575s\n2026-04-28T18:24:16.559056Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 78 eligible frames\n2026-04-28T18:24:16.596020Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=246 elapsed=1.752819416s\n2026-04-28T18:24:21.049775Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 31 frames, 8.1MB → 0.4MB (18.8x), 31 JPEGs deleted\n2026-04-28T18:24:35.718459Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 45 frames, 7.3MB → 2.7MB (2.7x), 45 JPEGs deleted\n2026-04-28T18:27:46.371199Z WARN sqlx::query: summary=\"BEGIN IMMEDIATE\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=1.099897791s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T18:29:48.752521Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=255 elapsed=2.115721292s\n2026-04-28T18:29:51.054020Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=70 elapsed=15.212678792s\n2026-04-28T18:29:51.054164Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 70 eligible frames\n2026-04-28T18:29:53.661408Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 30 frames, 7.9MB → 0.5MB (14.5x), 30 JPEGs deleted\n2026-04-28T18:29:59.515910Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 6.1MB → 2.6MB (2.3x), 38 JPEGs deleted\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T18:35:11.275137Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=257 elapsed=1.890251791s\n2026-04-28T18:35:13.565990Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=58 elapsed=14.023576042s\n2026-04-28T18:35:13.566708Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 58 eligible frames\n2026-04-28T18:35:15.986131Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 6.3MB → 0.4MB (14.8x), 24 JPEGs deleted\n2026-04-28T18:35:21.127038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 32 frames, 4.8MB → 2.0MB (2.4x), 32 JPEGs deleted\n2026-04-28T18:36:21.444171Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=257 elapsed=1.478779s\n2026-04-28T18:36:54.736632Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7349402793474718158, trigger=visual_change)\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T18:38:24.648333Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7138146743394558203, trigger=click)\n2026-04-28T18:40:30.102499Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=264 elapsed=2.280901875s\n2026-04-28T18:40:41.876243Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=55 elapsed=20.714885166s\n2026-04-28T18:40:41.877272Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 55 eligible frames\n2026-04-28T18:40:43.565653Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 20 frames, 5.2MB → 0.4MB (12.4x), 20 JPEGs deleted\n2026-04-28T18:40:47.405111Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 33 frames, 5.0MB → 2.2MB (2.2x), 33 JPEGs deleted\n2026-04-28T18:40:55.281930Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=264 elapsed=2.497021667s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T18:45:57.736770Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=269 elapsed=1.472064125s\n2026-04-28T18:46:02.552257Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=36 elapsed=15.12999075s\n2026-04-28T18:46:02.552440Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 36 eligible frames\n2026-04-28T18:46:03.937817Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 3.4MB → 0.4MB (8.2x), 13 JPEGs deleted\n2026-04-28T18:46:06.882225Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.2MB → 1.5MB (2.2x), 21 JPEGs deleted\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T18:48:36.805777Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5539694277092651559, trigger=visual_change)\n2026-04-28T18:49:57.584913Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5539694277092651559, trigger=visual_change)\n2026-04-28T18:50:04.730346Z WARN sqlx::query: summary=\"BEGIN IMMEDIATE\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=1.905377875s\n2026-04-28T18:50:43.113582Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=271 elapsed=1.116028833s\n2026-04-28T18:51:29.107031Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=53 elapsed=20.394365583s\n2026-04-28T18:51:29.107446Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 53 eligible frames\n2026-04-28T18:51:35.119217Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 4.7MB → 0.4MB (11.2x), 18 JPEGs deleted\n2026-04-28T18:51:45.073027Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 33 frames, 5.5MB → 2.6MB (2.1x), 33 JPEGs deleted\n2026-04-28T18:52:11.079485Z WARN sqlx::query: summary=\"COMMIT\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=2.863818625s\n2026-04-28T18:52:13.829425Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=272 elapsed=1.205463375s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T18:57:00.274674Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=275 elapsed=2.229514334s\n2026-04-28T18:57:03.165166Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=53 elapsed=18.074134375s\n2026-04-28T18:57:03.165346Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 53 eligible frames\n2026-04-28T18:57:05.295348Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 26 frames, 6.8MB → 0.4MB (16.1x), 26 JPEGs deleted\n2026-04-28T18:57:09.900414Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.7MB → 1.1MB (4.2x), 25 JPEGs deleted\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T18:58:35.016645Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7048291109637827804, trigger=click)\n2026-04-28T19:00:46.037144Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-861378394059743613, trigger=visual_change)\n2026-04-28T19:01:15.697878Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8912297904943223984, trigger=visual_change)\n2026-04-28T19:02:26.221366Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=40 elapsed=15.89233725s\n2026-04-28T19:02:26.221825Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 40 eligible frames\n2026-04-28T19:02:29.576339Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.0MB → 0.4MB (11.8x), 19 JPEGs deleted\n2026-04-28T19:02:34.272184Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 3.1MB → 1.7MB (1.9x), 19 JPEGs deleted\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T19:06:07.674333Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.306041833s\n2026-04-28T19:07:49.677908Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=42 elapsed=14.889544208s\n2026-04-28T19:07:49.678057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 42 eligible frames\n2026-04-28T19:07:49.698803Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=2.614160833s\n2026-04-28T19:07:51.749436Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 16 frames, 4.2MB → 0.4MB (9.8x), 16 JPEGs deleted\n2026-04-28T19:07:54.899287Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 3.4MB → 2.0MB (1.7x), 24 JPEGs deleted\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T19:12:47.584193Z INFO screenpipe_engine::sleep_monitor: Screen locked (CGSession safety-net poll)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T19:13:11.255278Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.300413166s\n2026-04-28T19:13:12.794331Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=43 elapsed=13.258655834s\n2026-04-28T19:13:12.794470Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 43 eligible frames\n2026-04-28T19:13:12.808049Z INFO sck_rs::stream_manager: recreating stream for display 2 (resolution change)\n2026-04-28T19:13:12.912772Z WARN sqlx::query: summary=\"PRAGMA wal_checkpoint(TRUNCATE)\" db.statement=\"\" rows_affected=0 rows_returned=1 elapsed=3.082268708s\n2026-04-28T19:13:14.340148Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 20 frames, 5.2MB → 0.4MB (12.4x), 20 JPEGs deleted\n2026-04-28T19:13:16.959188Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.1MB → 1.2MB (2.6x), 21 JPEGs deleted\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T19:18:25.142345Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.23836225s\n2026-04-28T19:18:29.300778Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=12.331115584s\n2026-04-28T19:18:29.300988Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-28T19:18:30.226176Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.6MB → 0.4MB (6.3x), 10 JPEGs deleted\n2026-04-28T19:18:31.055886Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.5MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-28T19:22:38.544393Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.5900705s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T19:23:40.369244Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.312361333s\n2026-04-28T19:23:43.191714Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=18 elapsed=12.126468125s\n2026-04-28T19:23:43.192013Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 18 eligible frames\n2026-04-28T19:23:44.106092Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 8 frames, 2.1MB → 0.4MB (5.0x), 8 JPEGs deleted\n2026-04-28T19:23:44.986481Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 8 frames, 1.2MB → 0.2MB (5.6x), 8 JPEGs deleted\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T19:28:14.554244Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.295689792s\n2026-04-28T19:28:56.783829Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=2 elapsed=11.784984875s\n2026-04-28T19:28:56.783829Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=2.002671208s\n2026-04-28T19:28:56.784440Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 2 eligible frames\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T19:34:09.612319Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.744371791s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T19:39:22.341355Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.712969s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T19:44:34.476817Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.124650458s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T19:49:46.886222Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.407015833s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T19:54:59.091936Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.192314584s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T20:00:12.032661Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.9065265s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T20:05:24.232319Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.177178542s\n2026-04-28T20:05:35.453478Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.021219375s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T20:10:37.036038Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.788154208s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T20:15:49.333549Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.246618917s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T20:21:01.770347Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.407504125s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T20:26:14.358287Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.569856334s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T20:31:26.908016Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.558228667s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T20:36:39.175956Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.258857958s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T20:41:51.130413Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=11.939972875s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T20:47:04.036975Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.84198625s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T20:52:16.384693Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.330017792s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T20:57:28.742794Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.342226458s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T21:02:41.262921Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.525327291s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T21:07:51.994063Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=10.717519625s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T21:08:14.967216Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.590923666s\n2026-04-28T21:13:04.291137Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.286627042s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T21:18:10.800875Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.579926667s\n2026-04-28T21:18:16.422891Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.094094375s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T21:23:14.230473Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.169288125s\n2026-04-28T21:23:28.551252Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.114471625s\n2026-04-28T21:23:35.830878Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.096934083s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T21:28:39.497831Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=10.934832958s\n2026-04-28T21:28:49.944749Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.074718792s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T21:33:51.696608Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.191163792s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T21:39:04.217720Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.507398834s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T21:44:17.102738Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.855874417s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T21:49:29.594891Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.477808209s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T21:54:41.525895Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=11.889049083s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T21:59:44.640937Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=3.101056083s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T22:04:51.566764Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=6.913806041s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T22:09:08.667514Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.198861916s\n2026-04-28T22:10:02.395515Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=10.821276666s\n2026-04-28T22:10:50.318700Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.004136834s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T22:15:14.646427Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.238301292s\n2026-04-28T22:15:14.646817Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=2.519544s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T22:20:22.068957Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=7.408174875s\n2026-04-28T22:20:37.990962Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.168253125s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T22:23:18.698813Z INFO screenpipe_engine::sleep_monitor: Screen unlocked (CGSession safety-net poll)\n2026-04-28T22:23:18.706000Z INFO screenpipe_engine::event_driven_capture: invalidating persistent streams after unlock/wake for monitor 2\n2026-04-28T22:23:18.715962Z INFO sck_rs::stream_manager: stopped 1 persistent stream(s)\n2026-04-28T22:23:23.508163Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=3.313264166s\n2026-04-28T22:23:24.381024Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-28T22:23:29.464033Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)","depth":4,"value":"2026-04-28T16:07:03.361935Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:04.884403Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:05.202177Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:07.123899Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:08.584617Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:09.975643Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:10.221917Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:11.235748Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:11.573033Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:12.720817Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:13.085300Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:13.983235Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:15.315623Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:15.679709Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:16.294399Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:17.469168Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:17.704892Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:18.327350Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:18.584089Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:19.383211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:19.697209Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:20.683739Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:22.590735Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:23.502612Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:23.740842Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:24.632559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:24.961958Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:25.589407Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:30.159089Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:30.378744Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:34.788508Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:35.112244Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:35.943249Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:36.843570Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:37.166993Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:38.233737Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:42.733209Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:42.962402Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:44.443847Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:44.753972Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)\n2026-04-28T16:07:57.769188Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:07:58.113833Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T16:08:32.137779Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:08:34.603773Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:08:34.932275Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:08:36.780956Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=89 elapsed=11.844145s\n2026-04-28T16:08:36.781045Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 89 eligible frames\n2026-04-28T16:08:40.099262Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 43 frames, 16.5MB → 0.6MB (26.1x), 43 JPEGs deleted\n2026-04-28T16:08:42.789812Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 44 frames, 7.7MB → 0.3MB (29.9x), 44 JPEGs deleted\n2026-04-28T16:08:47.816306Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:08:48.080973Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:08:49.055512Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:09:14.695030Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:09:14.946613Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:11:42.049193Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:11:42.534314Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:11:52.738708Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:11:53.064036Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:11:59.869884Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:12:00.215936Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)\n2026-04-28T16:12:06.911557Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5781189571662577813, trigger=click)\n2026-04-28T16:12:07.093383Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5781189571662577813, trigger=click)\n2026-04-28T16:12:20.806166Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:21.032640Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:23.043723Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:23.369330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:25.662585Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:26.285107Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:27.289159Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:30.909210Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:31.157616Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:34.265113Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:12:34.507077Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T16:13:54.410986Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=81 elapsed=11.608799667s\n2026-04-28T16:13:54.411842Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 81 eligible frames\n2026-04-28T16:13:57.167507Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 15.7MB → 0.6MB (24.9x), 41 JPEGs deleted\n2026-04-28T16:13:59.574102Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 6.6MB → 0.3MB (25.9x), 38 JPEGs deleted\n2026-04-28T16:14:05.617758Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)\n2026-04-28T16:14:30.003264Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4871134950740386536, trigger=click)\n2026-04-28T16:14:30.266331Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4871134950740386536, trigger=click)\n2026-04-28T16:14:36.255363Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=9092815945908542616, trigger=click)\n2026-04-28T16:14:36.548566Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=9092815945908542616, trigger=click)\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T16:19:08.931864Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=178 elapsed=1.132447167s\n2026-04-28T16:19:11.931756Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=76 elapsed=12.367092209s\n2026-04-28T16:19:11.931987Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 76 eligible frames\n2026-04-28T16:19:15.012481Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 37 frames, 14.2MB → 0.6MB (22.5x), 37 JPEGs deleted\n2026-04-28T16:19:17.554472Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 37 frames, 6.5MB → 0.3MB (25.2x), 37 JPEGs deleted\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T16:24:27.038545Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=178 elapsed=1.000578959s\n2026-04-28T16:24:29.034280Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=46 elapsed=11.139412958s\n2026-04-28T16:24:29.035034Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames\n2026-04-28T16:24:30.963871Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 23 frames, 8.8MB → 0.6MB (14.0x), 23 JPEGs deleted\n2026-04-28T16:24:32.350677Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.7MB → 0.3MB (14.4x), 21 JPEGs deleted\n2026-04-28T16:26:09.542993Z INFO screenpipe_engine::sleep_monitor: Screen locked (CGSession safety-net poll)\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T16:29:43.556469Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=43 elapsed=11.198770125s\n2026-04-28T16:29:43.556550Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 43 eligible frames\n2026-04-28T16:29:44.986491Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 8.1MB → 0.6MB (12.8x), 21 JPEGs deleted\n2026-04-28T16:29:46.268687Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 20 frames, 3.5MB → 0.3MB (13.8x), 20 JPEGs deleted\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T16:34:57.128232Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=24 elapsed=10.763956s\n2026-04-28T16:34:57.128230Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=178 elapsed=1.4624175s\n2026-04-28T16:34:57.131408Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 24 eligible frames\n2026-04-28T16:34:58.083167Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 4.2MB → 0.6MB (6.7x), 11 JPEGs deleted\n2026-04-28T16:34:58.887644Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 1.9MB → 0.3MB (7.6x), 11 JPEGs deleted\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T16:40:09.584894Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=6 elapsed=10.685695125s\n2026-04-28T16:40:09.587850Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 6 eligible frames\n2026-04-28T16:40:10.068260Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 2 frames, 0.8MB → 0.6MB (1.3x), 2 JPEGs deleted\n2026-04-28T16:40:10.414309Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 2 frames, 0.3MB → 0.2MB (1.6x), 2 JPEGs deleted\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T16:45:21.393195Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=2 elapsed=10.966809042s\n2026-04-28T16:45:21.393281Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 2 eligible frames\n2026-04-28T16:46:56.332846Z INFO screenpipe_engine::sleep_monitor: Screen unlocked (CGSession safety-net poll)\n2026-04-28T16:46:56.334007Z INFO screenpipe_engine::event_driven_capture: invalidating persistent streams after unlock/wake for monitor 2\n2026-04-28T16:46:56.352112Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\n2026-04-28T16:46:58.304757Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-28T16:46:58.565809Z WARN screenpipe_engine::event_driven_capture: skipping capture: lock screen app 'loginwindow' on monitor 1\n2026-04-28T16:46:58.897766Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-28T16:46:59.184093Z WARN screenpipe_engine::event_driven_capture: skipping capture: lock screen app 'loginwindow' on monitor 2\n2026-04-28T16:47:01.338502Z INFO screenpipe_engine::sleep_monitor: Screen unlocked (CGSession safety-net poll)\n2026-04-28T16:47:01.390301Z INFO screenpipe_engine::event_driven_capture: invalidating persistent streams after unlock/wake for monitor 2\n2026-04-28T16:47:02.630076Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)\n2026-04-28T16:47:05.728990Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)\n2026-04-28T16:47:07.623977Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-28T16:47:28.943957Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=179 elapsed=2.634386708s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T16:50:17.222019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6216647555668337619, trigger=click)\n2026-04-28T16:50:35.797720Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=14.383813625s\n2026-04-28T16:51:42.581111Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7104241776089826277, trigger=click)\n2026-04-28T16:51:44.019608Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7104241776089826277, trigger=click)\n2026-04-28T16:53:08.025195Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6139761258158646866, trigger=click)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T16:53:53.588281Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3939156275097735830, trigger=click)\n2026-04-28T16:55:49.235703Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.968643708s\n2026-04-28T16:57:04.416388Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8581538536659125863, trigger=click)\n2026-04-28T16:57:12.492178Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8581538536659125863, trigger=click)\n2026-04-28T16:57:12.841981Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8581538536659125863, trigger=click)\n2026-04-28T16:57:14.415251Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8581538536659125863, trigger=visual_change)\n2026-04-28T16:57:14.726963Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8581538536659125863, trigger=click)\n2026-04-28T16:57:17.407196Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8581538536659125863, trigger=visual_change)\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T17:00:57.997500Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=196 elapsed=2.082627917s\n2026-04-28T17:01:14.953984Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=37 elapsed=24.41720925s\n2026-04-28T17:01:14.966099Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 37 eligible frames\n2026-04-28T17:01:17.943398Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 3.3MB → 0.4MB (8.8x), 18 JPEGs deleted\n2026-04-28T17:01:22.631343Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 2.9MB → 1.1MB (2.5x), 19 JPEGs deleted\n2026-04-28T17:01:33.886858Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=197 elapsed=1.1513605s\n2026-04-28T17:01:35.848522Z INFO screenpipe_engine::meeting_detector: meeting v2: Idle -> Confirming (app=Firefox, signals=2)\n2026-04-28T17:01:41.903090Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=197 elapsed=1.052568042s\n2026-04-28T17:01:45.412020Z INFO screenpipe_engine::meeting_detector: meeting v2: Confirming -> Active (app=Firefox, signals=2, browser=true)\n2026-04-28T17:01:46.211477Z INFO screenpipe_engine::meeting_detector: meeting v2: meeting started (id=18, app=Firefox, title=None)\n2026-04-28T17:02:53.351145Z WARN sqlx::query: summary=\"COMMIT\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=1.195813541s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T17:04:32.492320Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T17:04:40.831992Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)\n2026-04-28T17:05:19.749943Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=520550632255337786, trigger=visual_change)\n2026-04-28T17:06:36.762718Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8913262551050344622, trigger=click)\n2026-04-28T17:06:37.394423Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8913262551050344622, trigger=click)\n2026-04-28T17:06:38.571150Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=78 elapsed=15.889136334s\n2026-04-28T17:06:38.571330Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 78 eligible frames\n2026-04-28T17:06:41.727150Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 36 frames, 8.7MB → 1.5MB (5.7x), 36 JPEGs deleted\n2026-04-28T17:06:47.337599Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 6.3MB → 2.8MB (2.2x), 40 JPEGs deleted\n2026-04-28T17:07:35.259124Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=203 elapsed=1.296070334s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T17:11:54.187082Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=209 elapsed=1.028743583s\n2026-04-28T17:11:57.308650Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8297064725994209049, trigger=visual_change)\n2026-04-28T17:12:03.975962Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=97 elapsed=16.608343459s\n2026-04-28T17:12:03.980035Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 97 eligible frames\n2026-04-28T17:12:09.423715Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 8.8MB → 1.3MB (7.0x), 38 JPEGs deleted\n2026-04-28T17:12:18.745568Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 57 frames, 9.2MB → 5.1MB (1.8x), 57 JPEGs deleted\n2026-04-28T17:12:28.910725Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8297064725994209049, trigger=click)\n2026-04-28T17:12:47.242180Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=210 elapsed=1.053630416s\n2026-04-28T17:12:50.549067Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7463698365302281039, trigger=click)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T17:13:10.200772Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5154540507509216989, trigger=click)\n2026-04-28T17:13:10.768365Z WARN sqlx::query: summary=\"PRAGMA wal_checkpoint(TRUNCATE)\" db.statement=\"\" rows_affected=0 rows_returned=1 elapsed=1.391680292s\n2026-04-28T17:17:32.658004Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=212 elapsed=2.466153666s\n2026-04-28T17:17:35.955873Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=app_switch, monitor=1) — DB pool may be saturated\n2026-04-28T17:17:44.553826Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=64 elapsed=25.777843041s\n2026-04-28T17:17:44.559382Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 64 eligible frames\n2026-04-28T17:17:50.399756Z INFO screenpipe_engine::event_driven_capture: monitor 1 capture recovered after 1 consecutive errors\n2026-04-28T17:17:50.799123Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 30 frames, 5.2MB → 2.2MB (2.4x), 30 JPEGs deleted\n2026-04-28T17:18:01.010642Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 32 frames, 6.5MB → 2.9MB (2.3x), 32 JPEGs deleted\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T17:18:33.982766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7174140395946848829, trigger=click)\n2026-04-28T17:18:59.164878Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3302386423956492591, trigger=click)\n2026-04-28T17:19:41.104295Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3302386423956492591, trigger=visual_change)\n2026-04-28T17:21:03.299035Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=1.689362708s\n2026-04-28T17:21:52.490456Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4085796735682377830, trigger=visual_change)\n2026-04-28T17:22:50.204657Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5154540507509216989, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T17:23:14.691712Z WARN sqlx::query: summary=\"PRAGMA wal_checkpoint(TRUNCATE)\" db.statement=\"\" rows_affected=0 rows_returned=1 elapsed=5.316957667s\n2026-04-28T17:23:14.705751Z WARN screenpipe_db::db: wal checkpoint: busy (could not truncate), 358 pages in WAL\n2026-04-28T17:23:14.732610Z WARN sqlx::query: summary=\"BEGIN IMMEDIATE\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=2.276639s\n2026-04-28T17:23:14.953280Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=2.135656625s\n2026-04-28T17:23:17.000358Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=32621934252632853, trigger=click)\n2026-04-28T17:23:18.870480Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=63 elapsed=17.872300875s\n2026-04-28T17:23:18.870810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 63 eligible frames\n2026-04-28T17:23:24.674735Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 4.4MB → 1.6MB (2.7x), 27 JPEGs deleted\n2026-04-28T17:23:30.134096Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 34 frames, 6.0MB → 2.6MB (2.3x), 34 JPEGs deleted\n2026-04-28T17:23:47.062619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)\n2026-04-28T17:23:47.660094Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=visual_change)\n2026-04-28T17:24:26.590876Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=visual_change)\n2026-04-28T17:24:35.057777Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)\n2026-04-28T17:24:36.251095Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=visual_change)\n2026-04-28T17:24:39.405376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=visual_change)\n2026-04-28T17:24:53.019411Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)\n2026-04-28T17:25:14.348055Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=click)\n2026-04-28T17:25:30.864453Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=click)\n2026-04-28T17:25:31.625221Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)\n2026-04-28T17:27:39.084601Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T17:27:46.115702Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T17:28:43.734362Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=1.59602225s\n2026-04-28T17:28:52.344071Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=61 elapsed=22.19854525s\n2026-04-28T17:28:52.344502Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 61 eligible frames\n2026-04-28T17:29:01.211744Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 31 frames, 5.3MB → 1.9MB (2.7x), 31 JPEGs deleted\n2026-04-28T17:29:11.576322Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 28 frames, 5.0MB → 3.2MB (1.6x), 28 JPEGs deleted\n2026-04-28T17:30:06.736879Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8813990094162065370, trigger=visual_change)\n2026-04-28T17:31:16.370446Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:31:17.489267Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:31:24.338365Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)\n2026-04-28T17:31:49.223910Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)\n2026-04-28T17:31:55.489490Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)\n2026-04-28T17:31:57.951399Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=visual_change)\n2026-04-28T17:31:58.927289Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:32:02.151996Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:32:02.752775Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:32:05.672044Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:32:10.766730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:32:11.767270Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)\n2026-04-28T17:32:14.898520Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)\n2026-04-28T17:32:30.033898Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)\n2026-04-28T17:32:36.337641Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)\n2026-04-28T17:32:42.601724Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)\n2026-04-28T17:32:49.882686Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)\n2026-04-28T17:32:52.871340Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T17:33:20.872909Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)\n2026-04-28T17:34:33.267284Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=2.737059125s\n2026-04-28T17:34:35.268208Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=50 elapsed=23.676462709s\n2026-04-28T17:34:35.269171Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 50 eligible frames\n2026-04-28T17:34:40.919221Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T17:34:43.456560Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 23 frames, 3.8MB → 1.3MB (2.9x), 23 JPEGs deleted\n2026-04-28T17:34:49.828980Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.8MB → 1.5MB (3.2x), 25 JPEGs deleted\n2026-04-28T17:34:51.319224Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)\n2026-04-28T17:37:53.608170Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=1.446908208s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T17:38:38.976168Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-844953656408637404, trigger=visual_change)\n2026-04-28T17:38:45.388397Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-844953656408637404, trigger=visual_change)\n2026-04-28T17:38:54.425051Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7805582611831809135, trigger=visual_change)\n2026-04-28T17:40:08.683806Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=53 elapsed=18.758745375s\n2026-04-28T17:40:08.684515Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 53 eligible frames\n2026-04-28T17:40:08.720339Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=1.41316125s\n2026-04-28T17:40:14.527057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 4.4MB → 1.8MB (2.5x), 27 JPEGs deleted\n2026-04-28T17:40:19.017809Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 5.0MB → 1.7MB (3.0x), 24 JPEGs deleted\n2026-04-28T17:40:45.760291Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-1920675205105101407, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T17:44:44.523433Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6005834167210030885, trigger=click)\n2026-04-28T17:45:36.046790Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=214 elapsed=2.354551584s\n2026-04-28T17:45:48.797258Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=35 elapsed=29.080941084s\n2026-04-28T17:45:48.797852Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 35 eligible frames\n2026-04-28T17:45:52.808293Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 2.8MB → 1.1MB (2.6x), 17 JPEGs deleted\n2026-04-28T17:45:56.267588Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 16 frames, 2.9MB → 0.9MB (3.2x), 16 JPEGs deleted\n2026-04-28T17:45:59.734072Z WARN sqlx::query: summary=\"BEGIN IMMEDIATE\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=2.43974075s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T17:48:11.307977Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-310266387443272529, trigger=click)\n2026-04-28T17:50:06.399275Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=215 elapsed=1.493682625s\n2026-04-28T17:51:22.688798Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=43 elapsed=26.391488834s\n2026-04-28T17:51:22.690714Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 43 eligible frames\n2026-04-28T17:51:29.036691Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.6MB → 1.4MB (2.7x), 22 JPEGs deleted\n2026-04-28T17:51:32.222940Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 2.7MB → 0.4MB (6.6x), 19 JPEGs deleted\n2026-04-28T17:52:04.754173Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3769295062857853594, trigger=click)\n2026-04-28T17:52:13.489892Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3769295062857853594, trigger=visual_change)\n2026-04-28T17:52:15.091164Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3769295062857853594, trigger=click)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T17:53:48.873572Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6254911494541167184, trigger=click)\n2026-04-28T17:56:43.964294Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=216 elapsed=1.621008083s\n2026-04-28T17:56:53.860942Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=43 elapsed=21.317519709s\n2026-04-28T17:56:53.861419Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 43 eligible frames\n2026-04-28T17:56:58.615624Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 23 frames, 3.5MB → 1.3MB (2.6x), 23 JPEGs deleted\n2026-04-28T17:57:02.978805Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 2.7MB → 0.8MB (3.2x), 18 JPEGs deleted\n2026-04-28T17:57:26.396309Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T17:57:32.405615Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T18:01:25.451495Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T18:01:26.059212Z WARN sqlx::query: summary=\"COMMIT\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=2.378852666s\n2026-04-28T18:01:32.813958Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)\n2026-04-28T18:02:22.865372Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=59 elapsed=19.861929375s\n2026-04-28T18:02:22.868572Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 59 eligible frames\n2026-04-28T18:02:28.010325Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 4.4MB → 1.6MB (2.7x), 27 JPEGs deleted\n2026-04-28T18:02:31.034840Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T18:02:35.341581Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 30 frames, 5.4MB → 2.2MB (2.4x), 30 JPEGs deleted\n2026-04-28T18:02:52.414456Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T18:03:22.286014Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)\n2026-04-28T18:06:38.897268Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=225 elapsed=1.272339875s\n2026-04-28T18:06:56.830727Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3059468017859355985, trigger=visual_change)\n2026-04-28T18:07:46.547699Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=226 elapsed=1.289059583s\n2026-04-28T18:07:49.469402Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=73 elapsed=13.809847041s\n2026-04-28T18:07:49.469802Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 73 eligible frames\n2026-04-28T18:07:54.084967Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 36 frames, 6.2MB → 2.3MB (2.7x), 36 JPEGs deleted\n2026-04-28T18:07:58.202315Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 35 frames, 6.5MB → 3.1MB (2.1x), 35 JPEGs deleted\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T18:08:30.182501Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Idle (timeout=300s, app=Firefox, id=18)\n2026-04-28T18:08:31.026260Z INFO screenpipe_engine::meeting_detector: meeting v2: meeting ended (id=18)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T18:13:12.197365Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=57 elapsed=13.981802916s\n2026-04-28T18:13:12.201813Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 57 eligible frames\n2026-04-28T18:13:12.369500Z WARN sqlx::query: summary=\"PRAGMA wal_checkpoint(TRUNCATE)\" db.statement=\"\" rows_affected=0 rows_returned=1 elapsed=2.777140458s\n2026-04-28T18:13:16.080941Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 3.8MB → 1.2MB (3.1x), 24 JPEGs deleted\n2026-04-28T18:13:22.515083Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 31 frames, 5.2MB → 2.0MB (2.6x), 31 JPEGs deleted\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T18:18:45.389294Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=72 elapsed=22.856535958s\n2026-04-28T18:18:45.394002Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 72 eligible frames\n2026-04-28T18:18:45.477022Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=245 elapsed=1.363011375s\n2026-04-28T18:18:52.269655Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 32 frames, 7.9MB → 1.3MB (5.9x), 32 JPEGs deleted\n2026-04-28T18:19:00.406515Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 6.1MB → 2.3MB (2.6x), 38 JPEGs deleted\n2026-04-28T18:21:03.916795Z WARN sqlx::query: summary=\"BEGIN IMMEDIATE\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=1.642808625s\n2026-04-28T18:21:31.158779Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=245 elapsed=1.711686125s\n2026-04-28T18:22:12.801109Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8839231840523050937, trigger=click)\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T18:24:16.556243Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=78 elapsed=16.13078575s\n2026-04-28T18:24:16.559056Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 78 eligible frames\n2026-04-28T18:24:16.596020Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=246 elapsed=1.752819416s\n2026-04-28T18:24:21.049775Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 31 frames, 8.1MB → 0.4MB (18.8x), 31 JPEGs deleted\n2026-04-28T18:24:35.718459Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 45 frames, 7.3MB → 2.7MB (2.7x), 45 JPEGs deleted\n2026-04-28T18:27:46.371199Z WARN sqlx::query: summary=\"BEGIN IMMEDIATE\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=1.099897791s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T18:29:48.752521Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=255 elapsed=2.115721292s\n2026-04-28T18:29:51.054020Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=70 elapsed=15.212678792s\n2026-04-28T18:29:51.054164Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 70 eligible frames\n2026-04-28T18:29:53.661408Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 30 frames, 7.9MB → 0.5MB (14.5x), 30 JPEGs deleted\n2026-04-28T18:29:59.515910Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 6.1MB → 2.6MB (2.3x), 38 JPEGs deleted\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T18:35:11.275137Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=257 elapsed=1.890251791s\n2026-04-28T18:35:13.565990Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=58 elapsed=14.023576042s\n2026-04-28T18:35:13.566708Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 58 eligible frames\n2026-04-28T18:35:15.986131Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 6.3MB → 0.4MB (14.8x), 24 JPEGs deleted\n2026-04-28T18:35:21.127038Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 32 frames, 4.8MB → 2.0MB (2.4x), 32 JPEGs deleted\n2026-04-28T18:36:21.444171Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=257 elapsed=1.478779s\n2026-04-28T18:36:54.736632Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7349402793474718158, trigger=visual_change)\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T18:38:24.648333Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7138146743394558203, trigger=click)\n2026-04-28T18:40:30.102499Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=264 elapsed=2.280901875s\n2026-04-28T18:40:41.876243Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=55 elapsed=20.714885166s\n2026-04-28T18:40:41.877272Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 55 eligible frames\n2026-04-28T18:40:43.565653Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 20 frames, 5.2MB → 0.4MB (12.4x), 20 JPEGs deleted\n2026-04-28T18:40:47.405111Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 33 frames, 5.0MB → 2.2MB (2.2x), 33 JPEGs deleted\n2026-04-28T18:40:55.281930Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=264 elapsed=2.497021667s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T18:45:57.736770Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=269 elapsed=1.472064125s\n2026-04-28T18:46:02.552257Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=36 elapsed=15.12999075s\n2026-04-28T18:46:02.552440Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 36 eligible frames\n2026-04-28T18:46:03.937817Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 3.4MB → 0.4MB (8.2x), 13 JPEGs deleted\n2026-04-28T18:46:06.882225Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.2MB → 1.5MB (2.2x), 21 JPEGs deleted\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T18:48:36.805777Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5539694277092651559, trigger=visual_change)\n2026-04-28T18:49:57.584913Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5539694277092651559, trigger=visual_change)\n2026-04-28T18:50:04.730346Z WARN sqlx::query: summary=\"BEGIN IMMEDIATE\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=1.905377875s\n2026-04-28T18:50:43.113582Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=271 elapsed=1.116028833s\n2026-04-28T18:51:29.107031Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=53 elapsed=20.394365583s\n2026-04-28T18:51:29.107446Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 53 eligible frames\n2026-04-28T18:51:35.119217Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 4.7MB → 0.4MB (11.2x), 18 JPEGs deleted\n2026-04-28T18:51:45.073027Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 33 frames, 5.5MB → 2.6MB (2.1x), 33 JPEGs deleted\n2026-04-28T18:52:11.079485Z WARN sqlx::query: summary=\"COMMIT\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=2.863818625s\n2026-04-28T18:52:13.829425Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=272 elapsed=1.205463375s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T18:57:00.274674Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=275 elapsed=2.229514334s\n2026-04-28T18:57:03.165166Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=53 elapsed=18.074134375s\n2026-04-28T18:57:03.165346Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 53 eligible frames\n2026-04-28T18:57:05.295348Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 26 frames, 6.8MB → 0.4MB (16.1x), 26 JPEGs deleted\n2026-04-28T18:57:09.900414Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.7MB → 1.1MB (4.2x), 25 JPEGs deleted\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T18:58:35.016645Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7048291109637827804, trigger=click)\n2026-04-28T19:00:46.037144Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-861378394059743613, trigger=visual_change)\n2026-04-28T19:01:15.697878Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8912297904943223984, trigger=visual_change)\n2026-04-28T19:02:26.221366Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=40 elapsed=15.89233725s\n2026-04-28T19:02:26.221825Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 40 eligible frames\n2026-04-28T19:02:29.576339Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 5.0MB → 0.4MB (11.8x), 19 JPEGs deleted\n2026-04-28T19:02:34.272184Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 3.1MB → 1.7MB (1.9x), 19 JPEGs deleted\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T19:06:07.674333Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.306041833s\n2026-04-28T19:07:49.677908Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=42 elapsed=14.889544208s\n2026-04-28T19:07:49.678057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 42 eligible frames\n2026-04-28T19:07:49.698803Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=2.614160833s\n2026-04-28T19:07:51.749436Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 16 frames, 4.2MB → 0.4MB (9.8x), 16 JPEGs deleted\n2026-04-28T19:07:54.899287Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 3.4MB → 2.0MB (1.7x), 24 JPEGs deleted\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T19:12:47.584193Z INFO screenpipe_engine::sleep_monitor: Screen locked (CGSession safety-net poll)\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T19:13:11.255278Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.300413166s\n2026-04-28T19:13:12.794331Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=43 elapsed=13.258655834s\n2026-04-28T19:13:12.794470Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 43 eligible frames\n2026-04-28T19:13:12.808049Z INFO sck_rs::stream_manager: recreating stream for display 2 (resolution change)\n2026-04-28T19:13:12.912772Z WARN sqlx::query: summary=\"PRAGMA wal_checkpoint(TRUNCATE)\" db.statement=\"\" rows_affected=0 rows_returned=1 elapsed=3.082268708s\n2026-04-28T19:13:14.340148Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 20 frames, 5.2MB → 0.4MB (12.4x), 20 JPEGs deleted\n2026-04-28T19:13:16.959188Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.1MB → 1.2MB (2.6x), 21 JPEGs deleted\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T19:18:25.142345Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.23836225s\n2026-04-28T19:18:29.300778Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=12.331115584s\n2026-04-28T19:18:29.300988Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-28T19:18:30.226176Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.6MB → 0.4MB (6.3x), 10 JPEGs deleted\n2026-04-28T19:18:31.055886Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.5MB → 0.2MB (7.0x), 10 JPEGs deleted\n2026-04-28T19:22:38.544393Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.5900705s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T19:23:40.369244Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.312361333s\n2026-04-28T19:23:43.191714Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=18 elapsed=12.126468125s\n2026-04-28T19:23:43.192013Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 18 eligible frames\n2026-04-28T19:23:44.106092Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 8 frames, 2.1MB → 0.4MB (5.0x), 8 JPEGs deleted\n2026-04-28T19:23:44.986481Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 8 frames, 1.2MB → 0.2MB (5.6x), 8 JPEGs deleted\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T19:28:14.554244Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.295689792s\n2026-04-28T19:28:56.783829Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=2 elapsed=11.784984875s\n2026-04-28T19:28:56.783829Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=2.002671208s\n2026-04-28T19:28:56.784440Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 2 eligible frames\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T19:34:09.612319Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.744371791s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T19:39:22.341355Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.712969s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T19:44:34.476817Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.124650458s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T19:49:46.886222Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.407015833s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T19:54:59.091936Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.192314584s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T20:00:12.032661Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.9065265s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T20:05:24.232319Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.177178542s\n2026-04-28T20:05:35.453478Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.021219375s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T20:10:37.036038Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.788154208s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T20:15:49.333549Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.246618917s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T20:21:01.770347Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.407504125s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T20:26:14.358287Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.569856334s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T20:31:26.908016Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.558228667s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T20:36:39.175956Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.258857958s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T20:41:51.130413Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=11.939972875s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T20:47:04.036975Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.84198625s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T20:52:16.384693Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.330017792s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T20:57:28.742794Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.342226458s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T21:02:41.262921Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.525327291s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T21:07:51.994063Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=10.717519625s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T21:08:14.967216Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.590923666s\n2026-04-28T21:13:04.291137Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.286627042s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T21:18:10.800875Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.579926667s\n2026-04-28T21:18:16.422891Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.094094375s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T21:23:14.230473Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.169288125s\n2026-04-28T21:23:28.551252Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.114471625s\n2026-04-28T21:23:35.830878Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.096934083s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T21:28:39.497831Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=10.934832958s\n2026-04-28T21:28:49.944749Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.074718792s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T21:33:51.696608Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.191163792s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T21:39:04.217720Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.507398834s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T21:44:17.102738Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.855874417s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T21:49:29.594891Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.477808209s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T21:54:41.525895Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=11.889049083s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T21:59:44.640937Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=3.101056083s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T22:04:51.566764Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=6.913806041s\n\n tip: wire screenpipe into claude with one command:\n claude mcp add screenpipe -- npx -y screenpipe-mcp\n then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity\n\n2026-04-28T22:09:08.667514Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.198861916s\n2026-04-28T22:10:02.395515Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=10.821276666s\n2026-04-28T22:10:50.318700Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.004136834s\n\n tip: install a starter bundle of pipes:\n screenpipe install https://screenpi.pe/start.json\n\n2026-04-28T22:15:14.646427Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=12.238301292s\n2026-04-28T22:15:14.646817Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=2.519544s\n\n tip: sign in for higher AI quotas + cloud sync:\n screenpipe login\n\n2026-04-28T22:20:22.068957Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=0 elapsed=7.408174875s\n2026-04-28T22:20:37.990962Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=1.168253125s\n\n tip: get the screenpipe desktop app for the full experience\n https://screenpi.pe\n\n2026-04-28T22:23:18.698813Z INFO screenpipe_engine::sleep_monitor: Screen unlocked (CGSession safety-net poll)\n2026-04-28T22:23:18.706000Z INFO screenpipe_engine::event_driven_capture: invalidating persistent streams after unlock/wake for monitor 2\n2026-04-28T22:23:18.715962Z INFO sck_rs::stream_manager: stopped 1 persistent stream(s)\n2026-04-28T22:23:23.508163Z WARN sqlx::query: summary=\"SELECT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELECT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFROM\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 seconds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT NULL\\n\" rows_affected=0 rows_returned=276 elapsed=3.313264166s\n2026-04-28T22:23:24.381024Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)\n2026-04-28T22:23:29.464033Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)","is_focused":true},{"role":"AXTextField","text":"you","depth":3,"bounds":{"left":0.7888889,"top":0.10555556,"width":0.13055556,"height":0.024444444},"automation_id":"_NS:65","value":"you","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.7902778,"top":0.10555556,"width":0.017361112,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.9013889,"top":0.10555556,"width":0.015277778,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.925,"top":0.10666667,"width":0.014583333,"height":0.023333333},"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.93958336,"top":0.10666667,"width":0.014583333,"height":0.023333333},"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.196875,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.196875,"top":0.05888889,"width":0.196875,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.20104167,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.39375,"top":0.05888889,"width":0.19652778,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.39791667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.5902778,"top":0.05888889,"width":0.19652778,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.59444445,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.78680557,"top":0.05888889,"width":0.19652778,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.79097223,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.47083333,"top":0.033333335,"width":0.058333334,"height":0.017777778},"role_description":"text"}]...
|
701252836073547312
|
914767387301356915
|
idle
|
accessibility
|
NULL
|
2026-04-28T16:07:03.361935Z INFO screenpipe_engin 2026-04-28T16:07:03.361935Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:04.884403Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:05.202177Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:07.123899Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:08.584617Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:09.975643Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:10.221917Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:11.235748Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:11.573033Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:12.720817Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:13.085300Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:13.983235Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:15.315623Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:15.679709Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:16.294399Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:17.469168Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:17.704892Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:18.327350Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:18.584089Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:19.383211Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:19.697209Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:20.683739Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:22.590735Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:23.502612Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:23.740842Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:24.632559Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:24.961958Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:25.589407Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:30.159089Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:30.378744Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:34.788508Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:35.112244Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:35.943249Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:36.843570Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:37.166993Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:38.233737Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:42.733209Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:42.962402Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:44.443847Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:44.753972Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=1930206417129158909, trigger=click)
2026-04-28T16:07:57.769188Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:07:58.113833Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-04-28T16:08:32.137779Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:08:34.603773Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:08:34.932275Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:08:36.780956Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=89 elapsed=11.844145s
2026-04-28T16:08:36.781045Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 89 eligible frames
2026-04-28T16:08:40.099262Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 43 frames, 16.5MB → 0.6MB (26.1x), 43 JPEGs deleted
2026-04-28T16:08:42.789812Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 44 frames, 7.7MB → 0.3MB (29.9x), 44 JPEGs deleted
2026-04-28T16:08:47.816306Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:08:48.080973Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:08:49.055512Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:09:14.695030Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:09:14.946613Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:11:42.049193Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:11:42.534314Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:11:52.738708Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:11:53.064036Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:11:59.869884Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:12:00.215936Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8145223211263381371, trigger=click)
2026-04-28T16:12:06.911557Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5781189571662577813, trigger=click)
2026-04-28T16:12:07.093383Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5781189571662577813, trigger=click)
2026-04-28T16:12:20.806166Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:21.032640Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:23.043723Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:23.369330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:25.662585Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:26.285107Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:27.289159Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:30.909210Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:31.157616Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:34.265113Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:12:34.507077Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5662093881576750551, trigger=click)
tip: install a starter bundle of pipes:
screenpipe install https://screenpi.pe/start.json
2026-04-28T16:13:54.410986Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=81 elapsed=11.608799667s
2026-04-28T16:13:54.411842Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 81 eligible frames
2026-04-28T16:13:57.167507Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 41 frames, 15.7MB → 0.6MB (24.9x), 41 JPEGs deleted
2026-04-28T16:13:59.574102Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 6.6MB → 0.3MB (25.9x), 38 JPEGs deleted
2026-04-28T16:14:05.617758Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5662093881576750551, trigger=click)
2026-04-28T16:14:30.003264Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4871134950740386536, trigger=click)
2026-04-28T16:14:30.266331Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4871134950740386536, trigger=click)
2026-04-28T16:14:36.255363Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=9092815945908542616, trigger=click)
2026-04-28T16:14:36.548566Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=9092815945908542616, trigger=click)
tip: sign in for higher AI quotas + cloud sync:
screenpipe login
2026-04-28T16:19:08.931864Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=178 elapsed=1.132447167s
2026-04-28T16:19:11.931756Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=76 elapsed=12.367092209s
2026-04-28T16:19:11.931987Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 76 eligible frames
2026-04-28T16:19:15.012481Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 37 frames, 14.2MB → 0.6MB (22.5x), 37 JPEGs deleted
2026-04-28T16:19:17.554472Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 37 frames, 6.5MB → 0.3MB (25.2x), 37 JPEGs deleted
tip: get the screenpipe desktop app for the full experience
https://screenpi.pe
2026-04-28T16:24:27.038545Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=178 elapsed=1.000578959s
2026-04-28T16:24:29.034280Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=46 elapsed=11.139412958s
2026-04-28T16:24:29.035034Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 46 eligible frames
2026-04-28T16:24:30.963871Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 23 frames, 8.8MB → 0.6MB (14.0x), 23 JPEGs deleted
2026-04-28T16:24:32.350677Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.7MB → 0.3MB (14.4x), 21 JPEGs deleted
2026-04-28T16:26:09.542993Z INFO screenpipe_engine::sleep_monitor: Screen locked (CGSession safety-net poll)
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-04-28T16:29:43.556469Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=43 elapsed=11.198770125s
2026-04-28T16:29:43.556550Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 43 eligible frames
2026-04-28T16:29:44.986491Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 8.1MB → 0.6MB (12.8x), 21 JPEGs deleted
2026-04-28T16:29:46.268687Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 20 frames, 3.5MB → 0.3MB (13.8x), 20 JPEGs deleted
tip: install a starter bundle of pipes:
screenpipe install https://screenpi.pe/start.json
2026-04-28T16:34:57.128232Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=24 elapsed=10.763956s
2026-04-28T16:34:57.128230Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=178 elapsed=1.4624175s
2026-04-28T16:34:57.131408Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 24 eligible frames
2026-04-28T16:34:58.083167Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 4.2MB → 0.6MB (6.7x), 11 JPEGs deleted
2026-04-28T16:34:58.887644Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 1.9MB → 0.3MB (7.6x), 11 JPEGs deleted
tip: sign in for higher AI quotas + cloud sync:
screenpipe login
2026-04-28T16:40:09.584894Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=6 elapsed=10.685695125s
2026-04-28T16:40:09.587850Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 6 eligible frames
2026-04-28T16:40:10.068260Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 2 frames, 0.8MB → 0.6MB (1.3x), 2 JPEGs deleted
2026-04-28T16:40:10.414309Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 2 frames, 0.3MB → 0.2MB (1.6x), 2 JPEGs deleted
tip: get the screenpipe desktop app for the full experience
https://screenpi.pe
2026-04-28T16:45:21.393195Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=2 elapsed=10.966809042s
2026-04-28T16:45:21.393281Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 2 eligible frames
2026-04-28T16:46:56.332846Z INFO screenpipe_engine::sleep_monitor: Screen unlocked (CGSession safety-net poll)
2026-04-28T16:46:56.334007Z INFO screenpipe_engine::event_driven_capture: invalidating persistent streams after unlock/wake for monitor 2
2026-04-28T16:46:56.352112Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
2026-04-28T16:46:58.304757Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)
2026-04-28T16:46:58.565809Z WARN screenpipe_engine::event_driven_capture: skipping capture: lock screen app 'loginwindow' on monitor 1
2026-04-28T16:46:58.897766Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)
2026-04-28T16:46:59.184093Z WARN screenpipe_engine::event_driven_capture: skipping capture: lock screen app 'loginwindow' on monitor 2
2026-04-28T16:47:01.338502Z INFO screenpipe_engine::sleep_monitor: Screen unlocked (CGSession safety-net poll)
2026-04-28T16:47:01.390301Z INFO screenpipe_engine::event_driven_capture: invalidating persistent streams after unlock/wake for monitor 2
2026-04-28T16:47:02.630076Z INFO sck_rs::stream_manager: stopped 2 persistent stream(s)
2026-04-28T16:47:05.728990Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 2 excluded)
2026-04-28T16:47:07.623977Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 2 excluded)
2026-04-28T16:47:28.943957Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=179 elapsed=2.634386708s
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-04-28T16:50:17.222019Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6216647555668337619, trigger=click)
2026-04-28T16:50:35.797720Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=0 elapsed=14.383813625s
2026-04-28T16:51:42.581111Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7104241776089826277, trigger=click)
2026-04-28T16:51:44.019608Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7104241776089826277, trigger=click)
2026-04-28T16:53:08.025195Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6139761258158646866, trigger=click)
tip: install a starter bundle of pipes:
screenpipe install https://screenpi.pe/start.json
2026-04-28T16:53:53.588281Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3939156275097735830, trigger=click)
2026-04-28T16:55:49.235703Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=0 elapsed=12.968643708s
2026-04-28T16:57:04.416388Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8581538536659125863, trigger=click)
2026-04-28T16:57:12.492178Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8581538536659125863, trigger=click)
2026-04-28T16:57:12.841981Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8581538536659125863, trigger=click)
2026-04-28T16:57:14.415251Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8581538536659125863, trigger=visual_change)
2026-04-28T16:57:14.726963Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8581538536659125863, trigger=click)
2026-04-28T16:57:17.407196Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8581538536659125863, trigger=visual_change)
tip: sign in for higher AI quotas + cloud sync:
screenpipe login
2026-04-28T17:00:57.997500Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=196 elapsed=2.082627917s
2026-04-28T17:01:14.953984Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=37 elapsed=24.41720925s
2026-04-28T17:01:14.966099Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 37 eligible frames
2026-04-28T17:01:17.943398Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 3.3MB → 0.4MB (8.8x), 18 JPEGs deleted
2026-04-28T17:01:22.631343Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 2.9MB → 1.1MB (2.5x), 19 JPEGs deleted
2026-04-28T17:01:33.886858Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=197 elapsed=1.1513605s
2026-04-28T17:01:35.848522Z INFO screenpipe_engine::meeting_detector: meeting v2: Idle -> Confirming (app=Firefox, signals=2)
2026-04-28T17:01:41.903090Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=197 elapsed=1.052568042s
2026-04-28T17:01:45.412020Z INFO screenpipe_engine::meeting_detector: meeting v2: Confirming -> Active (app=Firefox, signals=2, browser=true)
2026-04-28T17:01:46.211477Z INFO screenpipe_engine::meeting_detector: meeting v2: meeting started (id=18, app=Firefox, title=None)
2026-04-28T17:02:53.351145Z WARN sqlx::query: summary="COMMIT" db.statement="" rows_affected=1 rows_returned=0 elapsed=1.195813541s
tip: get the screenpipe desktop app for the full experience
https://screenpi.pe
2026-04-28T17:04:32.492320Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)
2026-04-28T17:04:40.831992Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)
2026-04-28T17:05:19.749943Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=520550632255337786, trigger=visual_change)
2026-04-28T17:06:36.762718Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8913262551050344622, trigger=click)
2026-04-28T17:06:37.394423Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8913262551050344622, trigger=click)
2026-04-28T17:06:38.571150Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=78 elapsed=15.889136334s
2026-04-28T17:06:38.571330Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 78 eligible frames
2026-04-28T17:06:41.727150Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 36 frames, 8.7MB → 1.5MB (5.7x), 36 JPEGs deleted
2026-04-28T17:06:47.337599Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 40 frames, 6.3MB → 2.8MB (2.2x), 40 JPEGs deleted
2026-04-28T17:07:35.259124Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=203 elapsed=1.296070334s
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-04-28T17:11:54.187082Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=209 elapsed=1.028743583s
2026-04-28T17:11:57.308650Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8297064725994209049, trigger=visual_change)
2026-04-28T17:12:03.975962Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=97 elapsed=16.608343459s
2026-04-28T17:12:03.980035Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 97 eligible frames
2026-04-28T17:12:09.423715Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 8.8MB → 1.3MB (7.0x), 38 JPEGs deleted
2026-04-28T17:12:18.745568Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 57 frames, 9.2MB → 5.1MB (1.8x), 57 JPEGs deleted
2026-04-28T17:12:28.910725Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8297064725994209049, trigger=click)
2026-04-28T17:12:47.242180Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=210 elapsed=1.053630416s
2026-04-28T17:12:50.549067Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-7463698365302281039, trigger=click)
tip: install a starter bundle of pipes:
screenpipe install https://screenpi.pe/start.json
2026-04-28T17:13:10.200772Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5154540507509216989, trigger=click)
2026-04-28T17:13:10.768365Z WARN sqlx::query: summary="PRAGMA wal_checkpoint(TRUNCATE)" db.statement="" rows_affected=0 rows_returned=1 elapsed=1.391680292s
2026-04-28T17:17:32.658004Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=212 elapsed=2.466153666s
2026-04-28T17:17:35.955873Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=app_switch, monitor=1) — DB pool may be saturated
2026-04-28T17:17:44.553826Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=64 elapsed=25.777843041s
2026-04-28T17:17:44.559382Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 64 eligible frames
2026-04-28T17:17:50.399756Z INFO screenpipe_engine::event_driven_capture: monitor 1 capture recovered after 1 consecutive errors
2026-04-28T17:17:50.799123Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 30 frames, 5.2MB → 2.2MB (2.4x), 30 JPEGs deleted
2026-04-28T17:18:01.010642Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 32 frames, 6.5MB → 2.9MB (2.3x), 32 JPEGs deleted
tip: sign in for higher AI quotas + cloud sync:
screenpipe login
2026-04-28T17:18:33.982766Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7174140395946848829, trigger=click)
2026-04-28T17:18:59.164878Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3302386423956492591, trigger=click)
2026-04-28T17:19:41.104295Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3302386423956492591, trigger=visual_change)
2026-04-28T17:21:03.299035Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=1.689362708s
2026-04-28T17:21:52.490456Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4085796735682377830, trigger=visual_change)
2026-04-28T17:22:50.204657Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5154540507509216989, trigger=click)
tip: get the screenpipe desktop app for the full experience
https://screenpi.pe
2026-04-28T17:23:14.691712Z WARN sqlx::query: summary="PRAGMA wal_checkpoint(TRUNCATE)" db.statement="" rows_affected=0 rows_returned=1 elapsed=5.316957667s
2026-04-28T17:23:14.705751Z WARN screenpipe_db::db: wal checkpoint: busy (could not truncate), 358 pages in WAL
2026-04-28T17:23:14.732610Z WARN sqlx::query: summary="BEGIN IMMEDIATE" db.statement="" rows_affected=1 rows_returned=0 elapsed=2.276639s
2026-04-28T17:23:14.953280Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=2.135656625s
2026-04-28T17:23:17.000358Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=32621934252632853, trigger=click)
2026-04-28T17:23:18.870480Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=63 elapsed=17.872300875s
2026-04-28T17:23:18.870810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 63 eligible frames
2026-04-28T17:23:24.674735Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 4.4MB → 1.6MB (2.7x), 27 JPEGs deleted
2026-04-28T17:23:30.134096Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 34 frames, 6.0MB → 2.6MB (2.3x), 34 JPEGs deleted
2026-04-28T17:23:47.062619Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)
2026-04-28T17:23:47.660094Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=visual_change)
2026-04-28T17:24:26.590876Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=visual_change)
2026-04-28T17:24:35.057777Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)
2026-04-28T17:24:36.251095Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=visual_change)
2026-04-28T17:24:39.405376Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=visual_change)
2026-04-28T17:24:53.019411Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)
2026-04-28T17:25:14.348055Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=click)
2026-04-28T17:25:30.864453Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4217574026314396109, trigger=click)
2026-04-28T17:25:31.625221Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4217574026314396109, trigger=click)
2026-04-28T17:27:39.084601Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)
2026-04-28T17:27:46.115702Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-04-28T17:28:43.734362Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=1.59602225s
2026-04-28T17:28:52.344071Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=61 elapsed=22.19854525s
2026-04-28T17:28:52.344502Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 61 eligible frames
2026-04-28T17:29:01.211744Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 31 frames, 5.3MB → 1.9MB (2.7x), 31 JPEGs deleted
2026-04-28T17:29:11.576322Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 28 frames, 5.0MB → 3.2MB (1.6x), 28 JPEGs deleted
2026-04-28T17:30:06.736879Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8813990094162065370, trigger=visual_change)
2026-04-28T17:31:16.370446Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)
2026-04-28T17:31:17.489267Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)
2026-04-28T17:31:24.338365Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)
2026-04-28T17:31:49.223910Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)
2026-04-28T17:31:55.489490Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)
2026-04-28T17:31:57.951399Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=visual_change)
2026-04-28T17:31:58.927289Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)
2026-04-28T17:32:02.151996Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)
2026-04-28T17:32:02.752775Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)
2026-04-28T17:32:05.672044Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)
2026-04-28T17:32:10.766730Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-234203118931115316, trigger=click)
2026-04-28T17:32:11.767270Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=click)
2026-04-28T17:32:14.898520Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-234203118931115316, trigger=visual_change)
2026-04-28T17:32:30.033898Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)
2026-04-28T17:32:36.337641Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)
2026-04-28T17:32:42.601724Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)
2026-04-28T17:32:49.882686Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)
2026-04-28T17:32:52.871340Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)
tip: install a starter bundle of pipes:
screenpipe install https://screenpi.pe/start.json
2026-04-28T17:33:20.872909Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7544925913445134419, trigger=visual_change)
2026-04-28T17:34:33.267284Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=2.737059125s
2026-04-28T17:34:35.268208Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=50 elapsed=23.676462709s
2026-04-28T17:34:35.269171Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 50 eligible frames
2026-04-28T17:34:40.919221Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=18, grace=300s)
2026-04-28T17:34:43.456560Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 23 frames, 3.8MB → 1.3MB (2.9x), 23 JPEGs deleted
2026-04-28T17:34:49.828980Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.8MB → 1.5MB (3.2x), 25 JPEGs deleted
2026-04-28T17:34:51.319224Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Active (controls reappeared, app=Firefox, id=18)
2026-04-28T17:37:53.608170Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=1.446908208s
tip: sign in for higher AI quotas + cloud sync:
screenpipe login
2026-04-28T17:38:38.976168Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-844953656408637404, trigger=visual_change)
2026-04-28T17:38:45.388397Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-844953656408637404, trigger=visual_change)
2026-04-28T17:38:54.425051Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7805582611831809135, trigger=visual_change)
2026-04-28T17:40:08.683806Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=53 elapsed=18.758745375s
2026-04-28T17:40:08.684515Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 53 eligible frames
2026-04-28T17:40:08.720339Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=1.41316125s
2026-04-28T17:40:14.527057Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 4.4MB → 1.8MB (2.5x), 27 JPEGs deleted
2026-04-28T17:40:19.017809Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 5.0MB → 1.7MB (3.0x), 24 JPEGs deleted
2026-04-28T17:40:45.760291Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-1920675205105101407, trigger=click)
tip: get the screenpipe desktop app for the full experience
https://screenpi.pe
2026-04-28T17:44:44.523433Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-6005834167210030885, trigger=click)
2026-04-28T17:45:36.046790Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=214 elapsed=2.354551584s
2026-04-28T17:45:48.797258Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=35 elapsed=29.080941084s
2026-04-28T17:45:48.797852Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 35 eligible frames
2026-04-28T17:45:52.808293Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 2.8MB → 1.1MB (2.6x), 17 JPEGs deleted
2026-04-28T17:45:56.267588Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 16 frames, 2.9MB → 0.9MB (3.2x), 16 JPEGs deleted
2026-04-28T17:45:59.734072Z WARN sqlx::query: summary="BEGIN IMMEDIATE" db.statement="" rows_affected=1 rows_returned=0 elapsed=2.43974075s
tip: wire screenpipe into claude with one command:
claude mcp add screenpipe -- npx -y screenpipe-mcp
then ask claude to build a pipe that tracks who you are, your todos, and how you spend your time from your screen activity
2026-04-28T17:48:11.307977Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-310266387443272529, trigger=click)
2026-04-28T17:50:06.399275Z WARN sqlx::query: summary="SELECT DISTINCT app_name, window_name, …" db.statement="\n\nSELECT\n DISTINCT app_name,\n window_name,\n browser_url\nFROM\n frames\nWHERE\n timestamp > datetime('now', '-30 seconds')\n AND app_name IS NOT NULL\n AND window_name IS NOT NULL\n" rows_affected=0 rows_returned=215 elapsed=1.493682625s
2026-04-28T17:51:22.688798Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=43 elapsed=26.391488834s
2026-04-28T17:51:22.690714Z INFO screenpipe_engine::snapshot_compaction: snapshot co...
|
NULL
|
NULL
|
|
1
|
1
|
0
|
2026-05-06T17:27:36.772517+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778088456772_m1.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
-rw-r--r-- 1 lukas staff 659494 28 Apr 10:38 -rw-r--r-- 1 lukas staff 659494 28 Apr 10:38 compact_monitor_1_1777361899343.mp4
-rw-r--r-- 1 lukas staff 659619 28 Apr 10:43 compact_monitor_1_1777362216761.mp4
-rw-r--r-- 1 lukas staff 658369 28 Apr 10:48 compact_monitor_1_1777362531562.mp4
-rw-r--r-- 1 lukas staff 658744 28 Apr 10:54 compact_monitor_1_1777362844570.mp4
-rw-r--r-- 1 lukas staff 658494 28 Apr 10:59 compact_monitor_1_1777363156173.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 11:04 compact_monitor_1_1777363471960.mp4
-rw-r--r-- 1 lukas staff 659244 28 Apr 11:09 compact_monitor_1_1777363780754.mp4
-rw-r--r-- 1 lukas staff 658119 28 Apr 11:14 compact_monitor_1_1777364091631.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 11:20 compact_monitor_1_1777364399949.mp4
-rw-r--r-- 1 lukas staff 658994 28 Apr 11:25 compact_monitor_1_1777364707696.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 11:30 compact_monitor_1_1777365021138.mp4
-rw-r--r-- 1 lukas staff 657494 28 Apr 11:35 compact_monitor_1_1777365334863.mp4
-rw-r--r-- 1 lukas staff 658744 28 Apr 11:40 compact_monitor_1_1777365647363.mp4
-rw-r--r-- 1 lukas staff 659619 28 Apr 11:46 compact_monitor_1_1777365960793.mp4
-rw-r--r-- 1 lukas staff 658369 28 Apr 11:51 compact_monitor_1_1777366272670.mp4
-rw-r--r-- 1 lukas staff 657869 28 Apr 11:56 compact_monitor_1_1777366581087.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 12:01 compact_monitor_1_1777366885670.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 12:06 compact_monitor_1_1777367201821.mp4
-rw-r--r-- 1 lukas staff 657994 28 Apr 12:11 compact_monitor_1_1777367517013.mp4
-rw-r--r-- 1 lukas staff 661994 28 Apr 12:17 compact_monitor_1_1777367833288.mp4
-rw-r--r-- 1 lukas staff 658869 28 Apr 12:22 compact_monitor_1_1777368158856.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 12:27 compact_monitor_1_1777368475271.mp4
-rw-r--r-- 1 lukas staff 659994 28 Apr 12:33 compact_monitor_1_1777368789494.mp4
-rw-r--r-- 1 lukas staff 658744 28 Apr 12:38 compact_monitor_1_1777369105746.mp4
-rw-r--r-- 1 lukas staff 658244 28 Apr 12:43 compact_monitor_1_1777369420420.mp4
-rw-r--r-- 1 lukas staff 659244 28 Apr 12:48 compact_monitor_1_1777369728628.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 12:54 compact_monitor_1_1777370046041.mp4
-rw-r--r-- 1 lukas staff 657869 28 Apr 12:59 compact_monitor_1_1777370361638.mp4
-rw-r--r-- 1 lukas staff 658994 28 Apr 13:04 compact_monitor_1_1777370677661.mp4
-rw-r--r-- 1 lukas staff 660995 28 Apr 13:09 compact_monitor_1_1777370991662.mp4
-rw-r--r-- 1 lukas staff 658619 28 Apr 13:15 compact_monitor_1_1777371307758.mp4
-rw-r--r-- 1 lukas staff 659119 28 Apr 13:20 compact_monitor_1_1777371622003.mp4
-rw-r--r-- 1 lukas staff 659119 28 Apr 13:25 compact_monitor_1_1777371936310.mp4
-rw-r--r-- 1 lukas staff 658119 28 Apr 13:30 compact_monitor_1_1777372250913.mp4
-rw-r--r-- 1 lukas staff 659869 28 Apr 13:36 compact_monitor_1_1777372563723.mp4
-rw-r--r-- 1 lukas staff 658619 28 Apr 13:41 compact_monitor_1_1777372878952.mp4
-rw-r--r-- 1 lukas staff 658119 28 Apr 13:46 compact_monitor_1_1777373192385.mp4
-rw-r--r-- 1 lukas staff 658119 28 Apr 13:51 compact_monitor_1_1777373505576.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 13:56 compact_monitor_1_1777373815249.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 14:02 compact_monitor_1_1777374129679.mp4
-rw-r--r-- 1 lukas staff 657869 28 Apr 14:07 compact_monitor_1_1777374442607.mp4
-rw-r--r-- 1 lukas staff 658619 28 Apr 14:12 compact_monitor_1_1777374754971.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 14:17 compact_monitor_1_1777375068922.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 14:23 compact_monitor_1_1777375395803.mp4
-rw-r--r-- 1 lukas staff 659619 28 Apr 14:28 compact_monitor_1_1777375713843.mp4
-rw-r--r-- 1 lukas staff 658869 28 Apr 14:33 compact_monitor_1_1777376032046.mp4
-rw-r--r-- 1 lukas staff 659494 28 Apr 14:39 compact_monitor_1_1777376346251.mp4
-rw-r--r-- 1 lukas staff 658744 28 Apr 14:44 compact_monitor_1_1777376655731.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 14:49 compact_monitor_1_1777376965747.mp4
-rw-r--r-- 1 lukas staff 658869 28 Apr 14:54 compact_monitor_1_1777377278905.mp4
-rw-r--r-- 1 lukas staff 658869 28 Apr 15:00 compact_monitor_1_1777377599386.mp4
-rw-r--r-- 1 lukas staff 659494 28 Apr 15:05 compact_monitor_1_1777377913234.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 15:10 compact_monitor_1_1777378230148.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 15:15 compact_monitor_1_1777378546013.mp4
-rw-r--r-- 1 lukas staff 658994 28 Apr 15:21 compact_monitor_1_1777378863028.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 15:26 compact_monitor_1_1777379181829.mp4
-rw-r--r-- 1 lukas staff 660244 28 Apr 15:31 compact_monitor_1_1777379498541.mp4
-rw-r--r-- 1 lukas staff 661370 28 Apr 15:36 compact_monitor_1_1777379816522.mp4
-rw-r--r-- 1 lukas staff 657994 28 Apr 15:42 compact_monitor_1_1777380132952.mp4
-rw-r--r-- 1 lukas staff 658494 28 Apr 15:47 compact_monitor_1_1777380451138.mp4
-rw-r--r-- 1 lukas staff 658119 28 Apr 15:52 compact_monitor_1_1777380769459.mp4
-rw-r--r-- 1 lukas staff 658869 28 Apr 15:58 compact_monitor_1_1777381085241.mp4
-rw-r--r-- 1 lukas staff 660245 28 Apr 16:03 compact_monitor_1_1777381399658.mp4
-rw-r--r-- 1 lukas staff 661870 28 Apr 16:08 compact_monitor_1_1777381716781.mp4
-rw-r--r-- 1 lukas staff 661620 28 Apr 16:13 compact_monitor_1_1777382034411.mp4
-rw-r--r-- 1 lukas staff 661118 28 Apr 16:19 compact_monitor_1_1777382351932.mp4
-rw-r--r-- 1 lukas staff 659369 28 Apr 16:24 compact_monitor_1_1777382669035.mp4
-rw-r--r-- 1 lukas staff 659119 28 Apr 16:29 compact_monitor_1_1777382983556.mp4
-rw-r--r-- 1 lukas staff 657869 28 Apr 16:34 compact_monitor_1_1777383297132.mp4
-rw-r--r-- 1 lukas staff 606367 28 Apr 16:40 compact_monitor_1_1777383609588.mp4
-rw-r--r-- 1 lukas staff 397068 28 Apr 17:01 compact_monitor_1_1777384874970.mp4
-rw-r--r-- 1 lukas staff 1592462 28 Apr 17:06 compact_monitor_1_1777385198571.mp4
-rw-r--r-- 1 lukas staff 1327809 28 Apr 17:12 compact_monitor_1_1777385523980.mp4
-rw-r--r-- 1 lukas staff 2262498 28 Apr 17:17 compact_monitor_1_1777385864559.mp4
-rw-r--r-- 1 lukas staff 1702453 28 Apr 17:23 compact_monitor_1_1777386198870.mp4
-rw-r--r-- 1 lukas staff 2034287 28 Apr 17:29 compact_monitor_1_1777386532344.mp4
-rw-r--r-- 1 lukas staff 1352893 28 Apr 17:34 compact_monitor_1_1777386875277.mp4
-rw-r--r-- 1 lukas staff 1873946 28 Apr 17:40 compact_monitor_1_1777387208685.mp4
-rw-r--r-- 1 lukas staff 1155463 28 Apr 17:45 compact_monitor_1_1777387548798.mp4
-rw-r--r-- 1 lukas staff 1428159 28 Apr 17:51 compact_monitor_1_1777387882691.mp4
-rw-r--r-- 1 lukas staff 1398484 28 Apr 17:56 compact_monitor_1_1777388213861.mp4
-rw-r--r-- 1 lukas staff 1688438 28 Apr 18:02 compact_monitor_1_1777388542869.mp4
-rw-r--r-- 1 lukas staff 2401161 28 Apr 18:07 compact_monitor_1_1777388869470.mp4
-rw-r--r-- 1 lukas staff 1283247 28 Apr 18:13 compact_monitor_1_1777389192202.mp4
-rw-r--r-- 1 lukas staff 1398160 28 Apr 18:18 compact_monitor_1_1777389525394.mp4
-rw-r--r-- 1 lukas staff 452906 28 Apr 18:24 compact_monitor_1_1777389856559.mp4
-rw-r--r-- 1 lukas staff 566518 28 Apr 18:29 compact_monitor_1_1777390191054.mp4
-rw-r--r-- 1 lukas staff 445894 28 Apr 18:35 compact_monitor_1_1777390513567.mp4
-rw-r--r-- 1 lukas staff 444044 28 Apr 18:40 compact_monitor_1_1777390841877.mp4
-rw-r--r-- 1 lukas staff 437853 28 Apr 18:46 compact_monitor_1_1777391162552.mp4
-rw-r--r-- 1 lukas staff 441008 28 Apr 18:51 compact_monitor_1_1777391489107.mp4
-rw-r--r-- 1 lukas staff 443934 28 Apr 18:57 compact_monitor_1_1777391823165.mp4
-rw-r--r-- 1 lukas staff 443624 28 Apr 19:02 compact_monitor_1_1777392146221.mp4
-rw-r--r-- 1 lukas staff 447164 28 Apr 19:07 compact_monitor_1_1777392469679.mp4
-rw-r--r-- 1 lukas staff 442431 28 Apr 19:13 compact_monitor_1_1777392792794.mp4
-rw-r--r-- 1 lukas staff 436805 28 Apr 19:18 compact_monitor_1_1777393109301.mp4
-rw-r--r-- 1 lukas staff 435633 28 Apr 19:23 compact_monitor_1_1777393423192.mp4
-rw-r--r-- 1 lukas staff 1162510 28 Apr 09:30 compact_monitor_2_1777357806702.mp4
-rw-r--r-- 1 lukas staff 3394878 28 Apr 09:35 compact_monitor_2_1777358126186.mp4
-rw-r--r-- 1 lukas staff 268044 28 Apr 09:40 compact_monitor_2_1777358443280.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 09:46 compact_monitor_2_1777358769231.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 09:51 compact_monitor_2_1777359084493.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 09:56 compact_monitor_2_1777359399758.mp4
-rw-r--r-- 1 lukas staff 266694 28 Apr 10:01 compact_monitor_2_1777359707884.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 10:06 compact_monitor_2_1777360016892.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 10:12 compact_monitor_2_1777360329199.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 10:17 compact_monitor_2_1777360641498.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 10:22 compact_monitor_2_1777360953971.mp4
-rw-r--r-- 1 lukas staff 267099 28 Apr 10:27 compact_monitor_2_1777361264266.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 10:33 compact_monitor_2_1777361583211.mp4
-rw-r--r-- 1 lukas staff 266829 28 Apr 10:38 compact_monitor_2_1777361903545.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 10:43 compact_monitor_2_1777362219032.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 10:48 compact_monitor_2_1777362532674.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 10:54 compact_monitor_2_1777362845950.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 10:59 compact_monitor_2_1777363157577.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 11:04 compact_monitor_2_1777363473776.mp4
-rw-r--r-- 1 lukas staff 267099 28 Apr 11:09 compact_monitor_2_1777363782342.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 11:14 compact_monitor_2_1777364092822.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 11:20 compact_monitor_2_1777364400840.mp4
-rw-r--r-- 1 lukas staff 266694 28 Apr 11:25 compact_monitor_2_1777364709144.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 11:30 compact_monitor_2_1777365022090.mp4
-rw-r--r-- 1 lukas staff 264669 28 Apr 11:35 compact_monitor_2_1777365335928.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 11:40 compact_monitor_2_1777365649137.mp4
-rw-r--r-- 1 lukas staff 266964 28 Apr 11:46 compact_monitor_2_1777365962619.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 11:51 compact_monitor_2_1777366273740.mp4
-rw-r--r-- 1 lukas staff 265209 28 Apr 11:56 compact_monitor_2_1777366582034.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 12:01 compact_monitor_2_1777366886631.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 12:06 compact_monitor_2_1777367202805.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 12:11 compact_monitor_2_1777367518861.mp4
-rw-r--r-- 1 lukas staff 269261 28 Apr 12:17 compact_monitor_2_1777367837441.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 12:22 compact_monitor_2_1777368160952.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 12:28 compact_monitor_2_1777368477571.mp4
-rw-r--r-- 1 lukas staff 267234 28 Apr 12:33 compact_monitor_2_1777368792600.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 12:38 compact_monitor_2_1777369107069.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 12:43 compact_monitor_2_1777369421530.mp4
-rw-r--r-- 1 lukas staff 266829 28 Apr 12:48 compact_monitor_2_1777369731189.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 12:54 compact_monitor_2_1777370048214.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 12:59 compact_monitor_2_1777370363567.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 13:04 compact_monitor_2_1777370679314.mp4
-rw-r--r-- 1 lukas staff 268855 28 Apr 13:09 compact_monitor_2_1777370994284.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 13:15 compact_monitor_2_1777371309064.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 13:20 compact_monitor_2_1777371623643.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 13:25 compact_monitor_2_1777371938006.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 13:30 compact_monitor_2_1777372252120.mp4
-rw-r--r-- 1 lukas staff 266964 28 Apr 13:36 compact_monitor_2_1777372566394.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 13:41 compact_monitor_2_1777372880197.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 13:46 compact_monitor_2_1777373193667.mp4
-rw-r--r-- 1 lukas staff 265209 28 Apr 13:51 compact_monitor_2_1777373506832.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 13:56 compact_monitor_2_1777373816197.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 14:02 compact_monitor_2_1777374130774.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 14:07 compact_monitor_2_1777374443527.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 14:12 compact_monitor_2_1777374756405.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 14:17 compact_monitor_2_1777375070551.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 14:23 compact_monitor_2_1777375397987.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 14:28 compact_monitor_2_1777375715930.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 14:33 compact_monitor_2_1777376034152.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 14:39 compact_monitor_2_1777376348246.mp4
-rw-r--r-- 1 lukas staff 266019 28 Apr 14:44 compact_monitor_2_1777376657026.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 14:49 compact_monitor_2_1777376966683.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 14:54 compact_monitor_2_1777377280571.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:00 compact_monitor_2_1777377602616.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:05 compact_monitor_2_1777377915467.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 15:10 compact_monitor_2_1777378232424.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 15:15 compact_monitor_2_1777378547117.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:21 compact_monitor_2_1777378865359.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 15:26 compact_monitor_2_1777379183376.mp4
-rw-r--r-- 1 lukas staff 267774 28 Apr 15:31 compact_monitor_2_1777379502714.mp4
-rw-r--r-- 1 lukas staff 268046 28 Apr 15:37 compact_monitor_2_1777379819259.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 15:42 compact_monitor_2_1777380134674.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 15:47 compact_monitor_2_1777380454708.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 15:52 compact_monitor_2_1777380771150.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 15:58 compact_monitor_2_1777381086934.mp4
-rw-r--r-- 1 lukas staff 268044 28 Apr 16:03 compact_monitor_2_1777381401816.mp4
-rw-r--r-- 1 lukas staff 269530 28 Apr 16:08 compact_monitor_2_1777381720100.mp4
-rw-r--r-- 1 lukas staff 268721 28 Apr 16:13 compact_monitor_2_1777382037168.mp4
-rw-r--r-- 1 lukas staff 268583 28 Apr 16:19 compact_monitor_2_1777382355014.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 16:24 compact_monitor_2_1777382670965.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 16:29 compact_monitor_2_1777382984987.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 16:34 compact_monitor_2_1777383298084.mp4
-rw-r--r-- 1 lukas staff 236209 28 Apr 16:40 compact_monitor_2_1777383610070.mp4
-rw-r--r-- 1 lukas staff 1191690 28 Apr 17:01 compact_monitor_2_1777384877981.mp4
-rw-r--r-- 1 lukas staff 2975861 28 Apr 17:06 compact_monitor_2_1777385201736.mp4
-rw-r--r-- 1 lukas staff 5319560 28 Apr 17:12 compact_monitor_2_1777385529432.mp4
-rw-r--r-- 1 lukas staff 3006284 28 Apr 17:18 compact_monitor_2_1777385870812.mp4
-rw-r--r-- 1 lukas staff 2726877 28 Apr 17:23 compact_monitor_2_1777386204715.mp4
-rw-r--r-- 1 lukas staff 3315722 28 Apr 17:29 compact_monitor_2_1777386541280.mp4
-rw-r--r-- 1 lukas staff 1577465 28 Apr 17:34 compact_monitor_2_1777386883461.mp4
-rw-r--r-- 1 lukas staff 1745214 28 Apr 17:40 compact_monitor_2_1777387214543.mp4
-rw-r--r-- 1 lukas staff 950993 28 Apr 17:45 compact_monitor_2_1777387552842.mp4
-rw-r--r-- 1 lukas staff 429007 28 Apr 17:51 compact_monitor_2_1777387889075.mp4
-rw-r--r-- 1 lukas staff 884099 28 Apr 17:57 compact_monitor_2_1777388218623.mp4
-rw-r--r-- 1 lukas staff 2352504 28 Apr 18:02 compact_monitor_2_1777388548021.mp4
-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4
-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4
-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4
-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4
-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4
-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4
-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4
-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4
-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4
-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4
-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4
-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4
-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4
-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4
-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22523176
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 28 Apr 16:51 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite
-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm
-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 18:58:18] ========================================
[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27
[2026-05-06 18:58:18] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m04s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m06s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m07s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)
frames (7543 rows) ⠴ %
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 19:22:16] ========================================
[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27
[2026-05-06 19:22:16] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m01s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m03s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ✓ 4m40s
ocr_text (2193 rows) ✓ 0m25s
ui_events (9909 rows) ✓ 0m02s
elements (470235 rows) ✓ 2m46s
meetings (3 rows) ✓ 0m00s
[+08m07s] ▶ Updating FTS indexes
elements_fts ✓ 2m59s
frames_fts ✓ 6m07s
ui_events_fts ✓ 0m03s
[+17m16s] ▶ Verifying DB
frames: 7543 / 7543 ✓
elements: 470235 / 470235 ✓
ui_events: 9909 / 9909 ✓
ocr_text: 2193 / 2193 ✓
meetings: 3 / 3 ✓
[+18m46s] ▶ Copying data folder for 2026-04-27
rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)
[2026-05-06 19:41:28] Archive DB size: 9.7G
[2026-05-06 19:41:28] Total time: 19m12s
[2026-05-06 19:41:28] Sync complete for 2026-04-27
[2026-05-06 19:41:28] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28
[2026-05-06 19:44:49] ========================================
[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28
[2026-05-06 19:44:49] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (9.7G)
Data dir: OK (223 files, 159M)
[+00m00s] ▶ Counting source rows for 2026-04-28
frames: 4535
elements: 407532
ui_events: 8621
ocr_text: 1623
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m00s
creating FTS tables ✓ 0m00s
[+00m02s] ▶ Syncing data for 2026-04-28
video_chunks ✓ 0m12s
frames (4535 rows) ✓ 1m30s
ocr_text (1623 rows) ✓ 0m32s
ui_events (8621 rows) ✓ 0m01s
elements (407532 rows) ✓ 1m02s
meetings (3 rows) ✓ 0m00s
[+03m19s] ▶ Updating FTS indexes
elements_fts ✓ 1m36s
frames_fts ✓ 2m28s
ui_events_fts ✓ 0m04s
[+07m27s] ▶ Verifying DB
frames: 4535 / 4535 ✓
elements: 407532 / 407532 ✓
ui_events: 8621 / 8621 ✓
ocr_text: 1623 / 1623 ✓
meetings: 3 / 3 ✓
[+08m59s] ▶ Copying data folder for 2026-04-28
rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)
[2026-05-06 19:54:08] Archive DB size: 10G
[2026-05-06 19:54:08] Total time: 9m19s
[2026-05-06 19:54:08] Sync complete for 2026-04-28
[2026-05-06 19:54:08] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll
total 24
drwx------ 9 lukas staff 288 28 Apr 09:18 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
drwx------ 5 lukas staff 160 1 Nov 2021 _cacache
drwx------@ 2 lukas staff 64 28 Apr 09:18 _locks
drwx------ 15 lukas staff 480 27 Apr 19:54 _logs
drwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx
-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked
-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json
-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 52920
drwx------+ 92 lukas staff 2944 6 May 20:22 .
drwxr-xr-x 5 root admin 160 23 Aug 2024 ..
-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding
-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store
drwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash
drwx------ 5 lukas staff 160 1 Nov 2021 .aws
-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json
-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history
-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc
drwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito
drwx------@ 6 lukas staff 192 9 Apr 19:53 .cache
drwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude
-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json
drwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium
drwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer
drwx------ 16 lukas staff 512 21 May 2025 .config
drwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue
drwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot
drwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor
drwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor
drwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona
drwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb
drwx------ 24 lukas staff 768 27 Apr 18:14 .docker
drwx------ 15 lukas staff 480 6 Jun 2023 .dropbox
drwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak
-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth
-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig
-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp
drwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon
drwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc
-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst
drwx------ 5 lukas staff 160 23 Dec 2024 .local
-rw------- 1 lukas staff 204 16 Mar 2024 .netrc
drwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp
-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history
-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer
drwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py
drwx------ 8 lukas staff 256 6 May 20:24 .npm
-rw------- 1 lukas staff 74 20 May 2024 .npmrc
drwx------ 32 lukas staff 1024 25 Jul 2025 .nvm
drwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile
-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history
drwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode
drwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight
drwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint
drwx------ 15 lukas staff 480 8 Aug 2025 .ssh
drwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit
drwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm
-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
UW PICO 5.09 New Buffer
[ Read 1 line ]
^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos
^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell
drwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm
drwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf
drwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn
-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc
-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile
-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy
-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave
-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save
-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees
-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc
drwx------@ 9 lukas staff 288 20 Apr 20:55 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV
drwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads
drwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen
drwx------@ 112 lukas staff 3584 2 Dec 09:19 Library
drwx------ 7 lukas staff 224 12 Feb 2024 Movies
drwx------+ 5 lukas staff 160 25 Sep 2023 Music
drwx------+ 9 lukas staff 288 25 Sep 2023 Pictures
drwx------ 3 lukas staff 96 8 Nov 2021 Postman
drwx------+ 4 lukas staff 128 28 Oct 2021 Public
-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf
drwx------ 4 lukas staff 128 2 Jul 2023 Users
-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log
-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log
-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4
-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 2025 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast
-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin
-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh
-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
cd: no such file or directory: /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated
checking permissions...
screen recording: ok
microphone: ok
accessibility: ok
2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-05-06T20:27:34.088403Z INFO scree...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"-rw-r--r-- 1 lukas staff 659494 28 Apr 10:38 compact_monitor_1_1777361899343.mp4\n-rw-r--r-- 1 lukas staff 659619 28 Apr 10:43 compact_monitor_1_1777362216761.mp4\n-rw-r--r-- 1 lukas staff 658369 28 Apr 10:48 compact_monitor_1_1777362531562.mp4\n-rw-r--r-- 1 lukas staff 658744 28 Apr 10:54 compact_monitor_1_1777362844570.mp4\n-rw-r--r-- 1 lukas staff 658494 28 Apr 10:59 compact_monitor_1_1777363156173.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 11:04 compact_monitor_1_1777363471960.mp4\n-rw-r--r-- 1 lukas staff 659244 28 Apr 11:09 compact_monitor_1_1777363780754.mp4\n-rw-r--r-- 1 lukas staff 658119 28 Apr 11:14 compact_monitor_1_1777364091631.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 11:20 compact_monitor_1_1777364399949.mp4\n-rw-r--r-- 1 lukas staff 658994 28 Apr 11:25 compact_monitor_1_1777364707696.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 11:30 compact_monitor_1_1777365021138.mp4\n-rw-r--r-- 1 lukas staff 657494 28 Apr 11:35 compact_monitor_1_1777365334863.mp4\n-rw-r--r-- 1 lukas staff 658744 28 Apr 11:40 compact_monitor_1_1777365647363.mp4\n-rw-r--r-- 1 lukas staff 659619 28 Apr 11:46 compact_monitor_1_1777365960793.mp4\n-rw-r--r-- 1 lukas staff 658369 28 Apr 11:51 compact_monitor_1_1777366272670.mp4\n-rw-r--r-- 1 lukas staff 657869 28 Apr 11:56 compact_monitor_1_1777366581087.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 12:01 compact_monitor_1_1777366885670.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 12:06 compact_monitor_1_1777367201821.mp4\n-rw-r--r-- 1 lukas staff 657994 28 Apr 12:11 compact_monitor_1_1777367517013.mp4\n-rw-r--r-- 1 lukas staff 661994 28 Apr 12:17 compact_monitor_1_1777367833288.mp4\n-rw-r--r-- 1 lukas staff 658869 28 Apr 12:22 compact_monitor_1_1777368158856.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 12:27 compact_monitor_1_1777368475271.mp4\n-rw-r--r-- 1 lukas staff 659994 28 Apr 12:33 compact_monitor_1_1777368789494.mp4\n-rw-r--r-- 1 lukas staff 658744 28 Apr 12:38 compact_monitor_1_1777369105746.mp4\n-rw-r--r-- 1 lukas staff 658244 28 Apr 12:43 compact_monitor_1_1777369420420.mp4\n-rw-r--r-- 1 lukas staff 659244 28 Apr 12:48 compact_monitor_1_1777369728628.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 12:54 compact_monitor_1_1777370046041.mp4\n-rw-r--r-- 1 lukas staff 657869 28 Apr 12:59 compact_monitor_1_1777370361638.mp4\n-rw-r--r-- 1 lukas staff 658994 28 Apr 13:04 compact_monitor_1_1777370677661.mp4\n-rw-r--r-- 1 lukas staff 660995 28 Apr 13:09 compact_monitor_1_1777370991662.mp4\n-rw-r--r-- 1 lukas staff 658619 28 Apr 13:15 compact_monitor_1_1777371307758.mp4\n-rw-r--r-- 1 lukas staff 659119 28 Apr 13:20 compact_monitor_1_1777371622003.mp4\n-rw-r--r-- 1 lukas staff 659119 28 Apr 13:25 compact_monitor_1_1777371936310.mp4\n-rw-r--r-- 1 lukas staff 658119 28 Apr 13:30 compact_monitor_1_1777372250913.mp4\n-rw-r--r-- 1 lukas staff 659869 28 Apr 13:36 compact_monitor_1_1777372563723.mp4\n-rw-r--r-- 1 lukas staff 658619 28 Apr 13:41 compact_monitor_1_1777372878952.mp4\n-rw-r--r-- 1 lukas staff 658119 28 Apr 13:46 compact_monitor_1_1777373192385.mp4\n-rw-r--r-- 1 lukas staff 658119 28 Apr 13:51 compact_monitor_1_1777373505576.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 13:56 compact_monitor_1_1777373815249.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 14:02 compact_monitor_1_1777374129679.mp4\n-rw-r--r-- 1 lukas staff 657869 28 Apr 14:07 compact_monitor_1_1777374442607.mp4\n-rw-r--r-- 1 lukas staff 658619 28 Apr 14:12 compact_monitor_1_1777374754971.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 14:17 compact_monitor_1_1777375068922.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 14:23 compact_monitor_1_1777375395803.mp4\n-rw-r--r-- 1 lukas staff 659619 28 Apr 14:28 compact_monitor_1_1777375713843.mp4\n-rw-r--r-- 1 lukas staff 658869 28 Apr 14:33 compact_monitor_1_1777376032046.mp4\n-rw-r--r-- 1 lukas staff 659494 28 Apr 14:39 compact_monitor_1_1777376346251.mp4\n-rw-r--r-- 1 lukas staff 658744 28 Apr 14:44 compact_monitor_1_1777376655731.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 14:49 compact_monitor_1_1777376965747.mp4\n-rw-r--r-- 1 lukas staff 658869 28 Apr 14:54 compact_monitor_1_1777377278905.mp4\n-rw-r--r-- 1 lukas staff 658869 28 Apr 15:00 compact_monitor_1_1777377599386.mp4\n-rw-r--r-- 1 lukas staff 659494 28 Apr 15:05 compact_monitor_1_1777377913234.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 15:10 compact_monitor_1_1777378230148.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 15:15 compact_monitor_1_1777378546013.mp4\n-rw-r--r-- 1 lukas staff 658994 28 Apr 15:21 compact_monitor_1_1777378863028.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 15:26 compact_monitor_1_1777379181829.mp4\n-rw-r--r-- 1 lukas staff 660244 28 Apr 15:31 compact_monitor_1_1777379498541.mp4\n-rw-r--r-- 1 lukas staff 661370 28 Apr 15:36 compact_monitor_1_1777379816522.mp4\n-rw-r--r-- 1 lukas staff 657994 28 Apr 15:42 compact_monitor_1_1777380132952.mp4\n-rw-r--r-- 1 lukas staff 658494 28 Apr 15:47 compact_monitor_1_1777380451138.mp4\n-rw-r--r-- 1 lukas staff 658119 28 Apr 15:52 compact_monitor_1_1777380769459.mp4\n-rw-r--r-- 1 lukas staff 658869 28 Apr 15:58 compact_monitor_1_1777381085241.mp4\n-rw-r--r-- 1 lukas staff 660245 28 Apr 16:03 compact_monitor_1_1777381399658.mp4\n-rw-r--r-- 1 lukas staff 661870 28 Apr 16:08 compact_monitor_1_1777381716781.mp4\n-rw-r--r-- 1 lukas staff 661620 28 Apr 16:13 compact_monitor_1_1777382034411.mp4\n-rw-r--r-- 1 lukas staff 661118 28 Apr 16:19 compact_monitor_1_1777382351932.mp4\n-rw-r--r-- 1 lukas staff 659369 28 Apr 16:24 compact_monitor_1_1777382669035.mp4\n-rw-r--r-- 1 lukas staff 659119 28 Apr 16:29 compact_monitor_1_1777382983556.mp4\n-rw-r--r-- 1 lukas staff 657869 28 Apr 16:34 compact_monitor_1_1777383297132.mp4\n-rw-r--r-- 1 lukas staff 606367 28 Apr 16:40 compact_monitor_1_1777383609588.mp4\n-rw-r--r-- 1 lukas staff 397068 28 Apr 17:01 compact_monitor_1_1777384874970.mp4\n-rw-r--r-- 1 lukas staff 1592462 28 Apr 17:06 compact_monitor_1_1777385198571.mp4\n-rw-r--r-- 1 lukas staff 1327809 28 Apr 17:12 compact_monitor_1_1777385523980.mp4\n-rw-r--r-- 1 lukas staff 2262498 28 Apr 17:17 compact_monitor_1_1777385864559.mp4\n-rw-r--r-- 1 lukas staff 1702453 28 Apr 17:23 compact_monitor_1_1777386198870.mp4\n-rw-r--r-- 1 lukas staff 2034287 28 Apr 17:29 compact_monitor_1_1777386532344.mp4\n-rw-r--r-- 1 lukas staff 1352893 28 Apr 17:34 compact_monitor_1_1777386875277.mp4\n-rw-r--r-- 1 lukas staff 1873946 28 Apr 17:40 compact_monitor_1_1777387208685.mp4\n-rw-r--r-- 1 lukas staff 1155463 28 Apr 17:45 compact_monitor_1_1777387548798.mp4\n-rw-r--r-- 1 lukas staff 1428159 28 Apr 17:51 compact_monitor_1_1777387882691.mp4\n-rw-r--r-- 1 lukas staff 1398484 28 Apr 17:56 compact_monitor_1_1777388213861.mp4\n-rw-r--r-- 1 lukas staff 1688438 28 Apr 18:02 compact_monitor_1_1777388542869.mp4\n-rw-r--r-- 1 lukas staff 2401161 28 Apr 18:07 compact_monitor_1_1777388869470.mp4\n-rw-r--r-- 1 lukas staff 1283247 28 Apr 18:13 compact_monitor_1_1777389192202.mp4\n-rw-r--r-- 1 lukas staff 1398160 28 Apr 18:18 compact_monitor_1_1777389525394.mp4\n-rw-r--r-- 1 lukas staff 452906 28 Apr 18:24 compact_monitor_1_1777389856559.mp4\n-rw-r--r-- 1 lukas staff 566518 28 Apr 18:29 compact_monitor_1_1777390191054.mp4\n-rw-r--r-- 1 lukas staff 445894 28 Apr 18:35 compact_monitor_1_1777390513567.mp4\n-rw-r--r-- 1 lukas staff 444044 28 Apr 18:40 compact_monitor_1_1777390841877.mp4\n-rw-r--r-- 1 lukas staff 437853 28 Apr 18:46 compact_monitor_1_1777391162552.mp4\n-rw-r--r-- 1 lukas staff 441008 28 Apr 18:51 compact_monitor_1_1777391489107.mp4\n-rw-r--r-- 1 lukas staff 443934 28 Apr 18:57 compact_monitor_1_1777391823165.mp4\n-rw-r--r-- 1 lukas staff 443624 28 Apr 19:02 compact_monitor_1_1777392146221.mp4\n-rw-r--r-- 1 lukas staff 447164 28 Apr 19:07 compact_monitor_1_1777392469679.mp4\n-rw-r--r-- 1 lukas staff 442431 28 Apr 19:13 compact_monitor_1_1777392792794.mp4\n-rw-r--r-- 1 lukas staff 436805 28 Apr 19:18 compact_monitor_1_1777393109301.mp4\n-rw-r--r-- 1 lukas staff 435633 28 Apr 19:23 compact_monitor_1_1777393423192.mp4\n-rw-r--r-- 1 lukas staff 1162510 28 Apr 09:30 compact_monitor_2_1777357806702.mp4\n-rw-r--r-- 1 lukas staff 3394878 28 Apr 09:35 compact_monitor_2_1777358126186.mp4\n-rw-r--r-- 1 lukas staff 268044 28 Apr 09:40 compact_monitor_2_1777358443280.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 09:46 compact_monitor_2_1777358769231.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 09:51 compact_monitor_2_1777359084493.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 09:56 compact_monitor_2_1777359399758.mp4\n-rw-r--r-- 1 lukas staff 266694 28 Apr 10:01 compact_monitor_2_1777359707884.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 10:06 compact_monitor_2_1777360016892.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 10:12 compact_monitor_2_1777360329199.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 10:17 compact_monitor_2_1777360641498.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 10:22 compact_monitor_2_1777360953971.mp4\n-rw-r--r-- 1 lukas staff 267099 28 Apr 10:27 compact_monitor_2_1777361264266.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 10:33 compact_monitor_2_1777361583211.mp4\n-rw-r--r-- 1 lukas staff 266829 28 Apr 10:38 compact_monitor_2_1777361903545.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 10:43 compact_monitor_2_1777362219032.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 10:48 compact_monitor_2_1777362532674.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 10:54 compact_monitor_2_1777362845950.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 10:59 compact_monitor_2_1777363157577.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 11:04 compact_monitor_2_1777363473776.mp4\n-rw-r--r-- 1 lukas staff 267099 28 Apr 11:09 compact_monitor_2_1777363782342.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 11:14 compact_monitor_2_1777364092822.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 11:20 compact_monitor_2_1777364400840.mp4\n-rw-r--r-- 1 lukas staff 266694 28 Apr 11:25 compact_monitor_2_1777364709144.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 11:30 compact_monitor_2_1777365022090.mp4\n-rw-r--r-- 1 lukas staff 264669 28 Apr 11:35 compact_monitor_2_1777365335928.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 11:40 compact_monitor_2_1777365649137.mp4\n-rw-r--r-- 1 lukas staff 266964 28 Apr 11:46 compact_monitor_2_1777365962619.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 11:51 compact_monitor_2_1777366273740.mp4\n-rw-r--r-- 1 lukas staff 265209 28 Apr 11:56 compact_monitor_2_1777366582034.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 12:01 compact_monitor_2_1777366886631.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 12:06 compact_monitor_2_1777367202805.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 12:11 compact_monitor_2_1777367518861.mp4\n-rw-r--r-- 1 lukas staff 269261 28 Apr 12:17 compact_monitor_2_1777367837441.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 12:22 compact_monitor_2_1777368160952.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 12:28 compact_monitor_2_1777368477571.mp4\n-rw-r--r-- 1 lukas staff 267234 28 Apr 12:33 compact_monitor_2_1777368792600.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 12:38 compact_monitor_2_1777369107069.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 12:43 compact_monitor_2_1777369421530.mp4\n-rw-r--r-- 1 lukas staff 266829 28 Apr 12:48 compact_monitor_2_1777369731189.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 12:54 compact_monitor_2_1777370048214.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 12:59 compact_monitor_2_1777370363567.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 13:04 compact_monitor_2_1777370679314.mp4\n-rw-r--r-- 1 lukas staff 268855 28 Apr 13:09 compact_monitor_2_1777370994284.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 13:15 compact_monitor_2_1777371309064.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 13:20 compact_monitor_2_1777371623643.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 13:25 compact_monitor_2_1777371938006.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 13:30 compact_monitor_2_1777372252120.mp4\n-rw-r--r-- 1 lukas staff 266964 28 Apr 13:36 compact_monitor_2_1777372566394.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 13:41 compact_monitor_2_1777372880197.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 13:46 compact_monitor_2_1777373193667.mp4\n-rw-r--r-- 1 lukas staff 265209 28 Apr 13:51 compact_monitor_2_1777373506832.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 13:56 compact_monitor_2_1777373816197.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 14:02 compact_monitor_2_1777374130774.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 14:07 compact_monitor_2_1777374443527.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 14:12 compact_monitor_2_1777374756405.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 14:17 compact_monitor_2_1777375070551.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 14:23 compact_monitor_2_1777375397987.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 14:28 compact_monitor_2_1777375715930.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 14:33 compact_monitor_2_1777376034152.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 14:39 compact_monitor_2_1777376348246.mp4\n-rw-r--r-- 1 lukas staff 266019 28 Apr 14:44 compact_monitor_2_1777376657026.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 14:49 compact_monitor_2_1777376966683.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 14:54 compact_monitor_2_1777377280571.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:00 compact_monitor_2_1777377602616.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:05 compact_monitor_2_1777377915467.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 15:10 compact_monitor_2_1777378232424.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 15:15 compact_monitor_2_1777378547117.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:21 compact_monitor_2_1777378865359.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 15:26 compact_monitor_2_1777379183376.mp4\n-rw-r--r-- 1 lukas staff 267774 28 Apr 15:31 compact_monitor_2_1777379502714.mp4\n-rw-r--r-- 1 lukas staff 268046 28 Apr 15:37 compact_monitor_2_1777379819259.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 15:42 compact_monitor_2_1777380134674.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 15:47 compact_monitor_2_1777380454708.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 15:52 compact_monitor_2_1777380771150.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 15:58 compact_monitor_2_1777381086934.mp4\n-rw-r--r-- 1 lukas staff 268044 28 Apr 16:03 compact_monitor_2_1777381401816.mp4\n-rw-r--r-- 1 lukas staff 269530 28 Apr 16:08 compact_monitor_2_1777381720100.mp4\n-rw-r--r-- 1 lukas staff 268721 28 Apr 16:13 compact_monitor_2_1777382037168.mp4\n-rw-r--r-- 1 lukas staff 268583 28 Apr 16:19 compact_monitor_2_1777382355014.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 16:24 compact_monitor_2_1777382670965.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 16:29 compact_monitor_2_1777382984987.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 16:34 compact_monitor_2_1777383298084.mp4\n-rw-r--r-- 1 lukas staff 236209 28 Apr 16:40 compact_monitor_2_1777383610070.mp4\n-rw-r--r-- 1 lukas staff 1191690 28 Apr 17:01 compact_monitor_2_1777384877981.mp4\n-rw-r--r-- 1 lukas staff 2975861 28 Apr 17:06 compact_monitor_2_1777385201736.mp4\n-rw-r--r-- 1 lukas staff 5319560 28 Apr 17:12 compact_monitor_2_1777385529432.mp4\n-rw-r--r-- 1 lukas staff 3006284 28 Apr 17:18 compact_monitor_2_1777385870812.mp4\n-rw-r--r-- 1 lukas staff 2726877 28 Apr 17:23 compact_monitor_2_1777386204715.mp4\n-rw-r--r-- 1 lukas staff 3315722 28 Apr 17:29 compact_monitor_2_1777386541280.mp4\n-rw-r--r-- 1 lukas staff 1577465 28 Apr 17:34 compact_monitor_2_1777386883461.mp4\n-rw-r--r-- 1 lukas staff 1745214 28 Apr 17:40 compact_monitor_2_1777387214543.mp4\n-rw-r--r-- 1 lukas staff 950993 28 Apr 17:45 compact_monitor_2_1777387552842.mp4\n-rw-r--r-- 1 lukas staff 429007 28 Apr 17:51 compact_monitor_2_1777387889075.mp4\n-rw-r--r-- 1 lukas staff 884099 28 Apr 17:57 compact_monitor_2_1777388218623.mp4\n-rw-r--r-- 1 lukas staff 2352504 28 Apr 18:02 compact_monitor_2_1777388548021.mp4\n-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4\n-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4\n-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4\n-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4\n-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4\n-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4\n-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4\n-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4\n-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4\n-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4\n-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4\n-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4\n-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4\n-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4\n-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22523176\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 28 Apr 16:51 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite\n-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27 \n[2026-05-06 18:58:18] ========================================\n[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 18:58:18] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m04s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m06s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m07s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)\n frames (7543 rows) ⠴ % \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27\n[2026-05-06 19:22:16] ========================================\n[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 19:22:16] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m01s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m03s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ✓ 4m40s\n ocr_text (2193 rows) ✓ 0m25s\n ui_events (9909 rows) ✓ 0m02s\n elements (470235 rows) ✓ 2m46s\n meetings (3 rows) ✓ 0m00s\n\n[+08m07s] ▶ Updating FTS indexes\n elements_fts ✓ 2m59s\n frames_fts ✓ 6m07s\n ui_events_fts ✓ 0m03s\n\n[+17m16s] ▶ Verifying DB\n frames: 7543 / 7543 ✓\n elements: 470235 / 470235 ✓\n ui_events: 9909 / 9909 ✓\n ocr_text: 2193 / 2193 ✓\n meetings: 3 / 3 ✓\n\n[+18m46s] ▶ Copying data folder for 2026-04-27\n rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)\n\n[2026-05-06 19:41:28] Archive DB size: 9.7G\n[2026-05-06 19:41:28] Total time: 19m12s\n[2026-05-06 19:41:28] Sync complete for 2026-04-27\n[2026-05-06 19:41:28] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28\n[2026-05-06 19:44:49] ========================================\n[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28\n[2026-05-06 19:44:49] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (9.7G)\n Data dir: OK (223 files, 159M)\n\n[+00m00s] ▶ Counting source rows for 2026-04-28\n frames: 4535\n elements: 407532\n ui_events: 8621\n ocr_text: 1623\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m00s\n creating FTS tables ✓ 0m00s\n\n[+00m02s] ▶ Syncing data for 2026-04-28\n video_chunks ✓ 0m12s\n frames (4535 rows) ✓ 1m30s\n ocr_text (1623 rows) ✓ 0m32s\n ui_events (8621 rows) ✓ 0m01s\n elements (407532 rows) ✓ 1m02s\n meetings (3 rows) ✓ 0m00s\n\n[+03m19s] ▶ Updating FTS indexes\n elements_fts ✓ 1m36s\n frames_fts ✓ 2m28s\n ui_events_fts ✓ 0m04s\n\n[+07m27s] ▶ Verifying DB\n frames: 4535 / 4535 ✓\n elements: 407532 / 407532 ✓\n ui_events: 8621 / 8621 ✓\n ocr_text: 1623 / 1623 ✓\n meetings: 3 / 3 ✓\n\n[+08m59s] ▶ Copying data folder for 2026-04-28\n rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)\n\n[2026-05-06 19:54:08] Archive DB size: 10G\n[2026-05-06 19:54:08] Total time: 9m19s\n[2026-05-06 19:54:08] Sync complete for 2026-04-28\n[2026-05-06 19:54:08] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll\ntotal 24\ndrwx------ 9 lukas staff 288 28 Apr 09:18 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\ndrwx------ 5 lukas staff 160 1 Nov 2021 _cacache\ndrwx------@ 2 lukas staff 64 28 Apr 09:18 _locks\ndrwx------ 15 lukas staff 480 27 Apr 19:54 _logs\ndrwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx\n-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked\n-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json\n-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll \ntotal 52920\ndrwx------+ 92 lukas staff 2944 6 May 20:22 .\ndrwxr-xr-x 5 root admin 160 23 Aug 2024 ..\n-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding\n-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store\ndrwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash\ndrwx------ 5 lukas staff 160 1 Nov 2021 .aws\n-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json\n-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history\n-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc\ndrwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito\ndrwx------@ 6 lukas staff 192 9 Apr 19:53 .cache\ndrwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude\n-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json\ndrwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium\ndrwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer\ndrwx------ 16 lukas staff 512 21 May 2025 .config\ndrwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue\ndrwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot\ndrwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor\ndrwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor\ndrwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona\ndrwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb\ndrwx------ 24 lukas staff 768 27 Apr 18:14 .docker\ndrwx------ 15 lukas staff 480 6 Jun 2023 .dropbox\ndrwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak\n-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth\n-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig\n-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp\ndrwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon\ndrwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc\n-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst\ndrwx------ 5 lukas staff 160 23 Dec 2024 .local\n-rw------- 1 lukas staff 204 16 Mar 2024 .netrc\ndrwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp\n-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history\n-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer\ndrwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py\ndrwx------ 8 lukas staff 256 6 May 20:24 .npm\n-rw------- 1 lukas staff 74 20 May 2024 .npmrc\ndrwx------ 32 lukas staff 1024 25 Jul 2025 .nvm\ndrwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile\n-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history\ndrwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode\ndrwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight\ndrwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint\ndrwx------ 15 lukas staff 480 8 Aug 2025 .ssh\ndrwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit\ndrwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm\n-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\n UW PICO 5.09 New Buffer \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n [ Read 1 line ] \n^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos \n^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell \ndrwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm\ndrwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf\ndrwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn\n-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc\n-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile\n-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy\n-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave\n-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save\n-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees\n-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc\ndrwx------@ 9 lukas staff 288 20 Apr 20:55 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV\ndrwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads\ndrwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen\ndrwx------@ 112 lukas staff 3584 2 Dec 09:19 Library\ndrwx------ 7 lukas staff 224 12 Feb 2024 Movies\ndrwx------+ 5 lukas staff 160 25 Sep 2023 Music\ndrwx------+ 9 lukas staff 288 25 Sep 2023 Pictures\ndrwx------ 3 lukas staff 96 8 Nov 2021 Postman\ndrwx------+ 4 lukas staff 128 28 Oct 2021 Public\n-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf\ndrwx------ 4 lukas staff 128 2 Jul 2023 Users\n-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log\n-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 2025 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast\n-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin\n-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh\n-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe\ncd: no such file or directory: /Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated\nchecking permissions...\n screen recording: ok\n microphone: ok\n accessibility: ok\n2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap\n2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update\n2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits\n2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown\n2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export\n2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary\n2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ false │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n│ retention mode │ media-only (keep transcripts) │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ MacBook Pro Microphone (input) │\n│ │ System Audio (output) │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-05-06T20:27:34.638384Z INFO screenpipe: starting UI event capture\n2026-05-06T20:27:34.637679Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-05-06T20:27:34.649154Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(94))\n2026-05-06T20:27:34.652794Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-05-06T20:27:34.655839Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-05-06T20:27:34.673877Z INFO screenpipe_engine::ui_recorder: UI recording session started: 54869993-7b4b-491f-b717-2a583517f9c5\n2026-05-06T20:27:34.673910Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-05-06T20:27:34.674057Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-05-05 17:27:34.674056 UTC to 2026-05-06 17:27:34.674056 UTC)\n2026-05-06T20:27:34.674892Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-05-06T20:27:34.675788Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 0 frame entries, coverage from 2026-05-05 17:27:34.674056 UTC\n2026-05-06T20:27:34.686546Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-05-06T20:27:34.691371Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-05-06T20:27:36.270608Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-05-06T20:27:36.270669Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.270714Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.932583Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-05-06T20:27:36.932852Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-05-06T20:27:36.932882Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-05-06T20:27:36.932899Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-05-06T20:27:36.932901Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-05-06T20:27:39.158281Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 3 excluded)","depth":4,"on_screen":true,"value":"-rw-r--r-- 1 lukas staff 659494 28 Apr 10:38 compact_monitor_1_1777361899343.mp4\n-rw-r--r-- 1 lukas staff 659619 28 Apr 10:43 compact_monitor_1_1777362216761.mp4\n-rw-r--r-- 1 lukas staff 658369 28 Apr 10:48 compact_monitor_1_1777362531562.mp4\n-rw-r--r-- 1 lukas staff 658744 28 Apr 10:54 compact_monitor_1_1777362844570.mp4\n-rw-r--r-- 1 lukas staff 658494 28 Apr 10:59 compact_monitor_1_1777363156173.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 11:04 compact_monitor_1_1777363471960.mp4\n-rw-r--r-- 1 lukas staff 659244 28 Apr 11:09 compact_monitor_1_1777363780754.mp4\n-rw-r--r-- 1 lukas staff 658119 28 Apr 11:14 compact_monitor_1_1777364091631.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 11:20 compact_monitor_1_1777364399949.mp4\n-rw-r--r-- 1 lukas staff 658994 28 Apr 11:25 compact_monitor_1_1777364707696.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 11:30 compact_monitor_1_1777365021138.mp4\n-rw-r--r-- 1 lukas staff 657494 28 Apr 11:35 compact_monitor_1_1777365334863.mp4\n-rw-r--r-- 1 lukas staff 658744 28 Apr 11:40 compact_monitor_1_1777365647363.mp4\n-rw-r--r-- 1 lukas staff 659619 28 Apr 11:46 compact_monitor_1_1777365960793.mp4\n-rw-r--r-- 1 lukas staff 658369 28 Apr 11:51 compact_monitor_1_1777366272670.mp4\n-rw-r--r-- 1 lukas staff 657869 28 Apr 11:56 compact_monitor_1_1777366581087.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 12:01 compact_monitor_1_1777366885670.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 12:06 compact_monitor_1_1777367201821.mp4\n-rw-r--r-- 1 lukas staff 657994 28 Apr 12:11 compact_monitor_1_1777367517013.mp4\n-rw-r--r-- 1 lukas staff 661994 28 Apr 12:17 compact_monitor_1_1777367833288.mp4\n-rw-r--r-- 1 lukas staff 658869 28 Apr 12:22 compact_monitor_1_1777368158856.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 12:27 compact_monitor_1_1777368475271.mp4\n-rw-r--r-- 1 lukas staff 659994 28 Apr 12:33 compact_monitor_1_1777368789494.mp4\n-rw-r--r-- 1 lukas staff 658744 28 Apr 12:38 compact_monitor_1_1777369105746.mp4\n-rw-r--r-- 1 lukas staff 658244 28 Apr 12:43 compact_monitor_1_1777369420420.mp4\n-rw-r--r-- 1 lukas staff 659244 28 Apr 12:48 compact_monitor_1_1777369728628.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 12:54 compact_monitor_1_1777370046041.mp4\n-rw-r--r-- 1 lukas staff 657869 28 Apr 12:59 compact_monitor_1_1777370361638.mp4\n-rw-r--r-- 1 lukas staff 658994 28 Apr 13:04 compact_monitor_1_1777370677661.mp4\n-rw-r--r-- 1 lukas staff 660995 28 Apr 13:09 compact_monitor_1_1777370991662.mp4\n-rw-r--r-- 1 lukas staff 658619 28 Apr 13:15 compact_monitor_1_1777371307758.mp4\n-rw-r--r-- 1 lukas staff 659119 28 Apr 13:20 compact_monitor_1_1777371622003.mp4\n-rw-r--r-- 1 lukas staff 659119 28 Apr 13:25 compact_monitor_1_1777371936310.mp4\n-rw-r--r-- 1 lukas staff 658119 28 Apr 13:30 compact_monitor_1_1777372250913.mp4\n-rw-r--r-- 1 lukas staff 659869 28 Apr 13:36 compact_monitor_1_1777372563723.mp4\n-rw-r--r-- 1 lukas staff 658619 28 Apr 13:41 compact_monitor_1_1777372878952.mp4\n-rw-r--r-- 1 lukas staff 658119 28 Apr 13:46 compact_monitor_1_1777373192385.mp4\n-rw-r--r-- 1 lukas staff 658119 28 Apr 13:51 compact_monitor_1_1777373505576.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 13:56 compact_monitor_1_1777373815249.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 14:02 compact_monitor_1_1777374129679.mp4\n-rw-r--r-- 1 lukas staff 657869 28 Apr 14:07 compact_monitor_1_1777374442607.mp4\n-rw-r--r-- 1 lukas staff 658619 28 Apr 14:12 compact_monitor_1_1777374754971.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 14:17 compact_monitor_1_1777375068922.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 14:23 compact_monitor_1_1777375395803.mp4\n-rw-r--r-- 1 lukas staff 659619 28 Apr 14:28 compact_monitor_1_1777375713843.mp4\n-rw-r--r-- 1 lukas staff 658869 28 Apr 14:33 compact_monitor_1_1777376032046.mp4\n-rw-r--r-- 1 lukas staff 659494 28 Apr 14:39 compact_monitor_1_1777376346251.mp4\n-rw-r--r-- 1 lukas staff 658744 28 Apr 14:44 compact_monitor_1_1777376655731.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 14:49 compact_monitor_1_1777376965747.mp4\n-rw-r--r-- 1 lukas staff 658869 28 Apr 14:54 compact_monitor_1_1777377278905.mp4\n-rw-r--r-- 1 lukas staff 658869 28 Apr 15:00 compact_monitor_1_1777377599386.mp4\n-rw-r--r-- 1 lukas staff 659494 28 Apr 15:05 compact_monitor_1_1777377913234.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 15:10 compact_monitor_1_1777378230148.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 15:15 compact_monitor_1_1777378546013.mp4\n-rw-r--r-- 1 lukas staff 658994 28 Apr 15:21 compact_monitor_1_1777378863028.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 15:26 compact_monitor_1_1777379181829.mp4\n-rw-r--r-- 1 lukas staff 660244 28 Apr 15:31 compact_monitor_1_1777379498541.mp4\n-rw-r--r-- 1 lukas staff 661370 28 Apr 15:36 compact_monitor_1_1777379816522.mp4\n-rw-r--r-- 1 lukas staff 657994 28 Apr 15:42 compact_monitor_1_1777380132952.mp4\n-rw-r--r-- 1 lukas staff 658494 28 Apr 15:47 compact_monitor_1_1777380451138.mp4\n-rw-r--r-- 1 lukas staff 658119 28 Apr 15:52 compact_monitor_1_1777380769459.mp4\n-rw-r--r-- 1 lukas staff 658869 28 Apr 15:58 compact_monitor_1_1777381085241.mp4\n-rw-r--r-- 1 lukas staff 660245 28 Apr 16:03 compact_monitor_1_1777381399658.mp4\n-rw-r--r-- 1 lukas staff 661870 28 Apr 16:08 compact_monitor_1_1777381716781.mp4\n-rw-r--r-- 1 lukas staff 661620 28 Apr 16:13 compact_monitor_1_1777382034411.mp4\n-rw-r--r-- 1 lukas staff 661118 28 Apr 16:19 compact_monitor_1_1777382351932.mp4\n-rw-r--r-- 1 lukas staff 659369 28 Apr 16:24 compact_monitor_1_1777382669035.mp4\n-rw-r--r-- 1 lukas staff 659119 28 Apr 16:29 compact_monitor_1_1777382983556.mp4\n-rw-r--r-- 1 lukas staff 657869 28 Apr 16:34 compact_monitor_1_1777383297132.mp4\n-rw-r--r-- 1 lukas staff 606367 28 Apr 16:40 compact_monitor_1_1777383609588.mp4\n-rw-r--r-- 1 lukas staff 397068 28 Apr 17:01 compact_monitor_1_1777384874970.mp4\n-rw-r--r-- 1 lukas staff 1592462 28 Apr 17:06 compact_monitor_1_1777385198571.mp4\n-rw-r--r-- 1 lukas staff 1327809 28 Apr 17:12 compact_monitor_1_1777385523980.mp4\n-rw-r--r-- 1 lukas staff 2262498 28 Apr 17:17 compact_monitor_1_1777385864559.mp4\n-rw-r--r-- 1 lukas staff 1702453 28 Apr 17:23 compact_monitor_1_1777386198870.mp4\n-rw-r--r-- 1 lukas staff 2034287 28 Apr 17:29 compact_monitor_1_1777386532344.mp4\n-rw-r--r-- 1 lukas staff 1352893 28 Apr 17:34 compact_monitor_1_1777386875277.mp4\n-rw-r--r-- 1 lukas staff 1873946 28 Apr 17:40 compact_monitor_1_1777387208685.mp4\n-rw-r--r-- 1 lukas staff 1155463 28 Apr 17:45 compact_monitor_1_1777387548798.mp4\n-rw-r--r-- 1 lukas staff 1428159 28 Apr 17:51 compact_monitor_1_1777387882691.mp4\n-rw-r--r-- 1 lukas staff 1398484 28 Apr 17:56 compact_monitor_1_1777388213861.mp4\n-rw-r--r-- 1 lukas staff 1688438 28 Apr 18:02 compact_monitor_1_1777388542869.mp4\n-rw-r--r-- 1 lukas staff 2401161 28 Apr 18:07 compact_monitor_1_1777388869470.mp4\n-rw-r--r-- 1 lukas staff 1283247 28 Apr 18:13 compact_monitor_1_1777389192202.mp4\n-rw-r--r-- 1 lukas staff 1398160 28 Apr 18:18 compact_monitor_1_1777389525394.mp4\n-rw-r--r-- 1 lukas staff 452906 28 Apr 18:24 compact_monitor_1_1777389856559.mp4\n-rw-r--r-- 1 lukas staff 566518 28 Apr 18:29 compact_monitor_1_1777390191054.mp4\n-rw-r--r-- 1 lukas staff 445894 28 Apr 18:35 compact_monitor_1_1777390513567.mp4\n-rw-r--r-- 1 lukas staff 444044 28 Apr 18:40 compact_monitor_1_1777390841877.mp4\n-rw-r--r-- 1 lukas staff 437853 28 Apr 18:46 compact_monitor_1_1777391162552.mp4\n-rw-r--r-- 1 lukas staff 441008 28 Apr 18:51 compact_monitor_1_1777391489107.mp4\n-rw-r--r-- 1 lukas staff 443934 28 Apr 18:57 compact_monitor_1_1777391823165.mp4\n-rw-r--r-- 1 lukas staff 443624 28 Apr 19:02 compact_monitor_1_1777392146221.mp4\n-rw-r--r-- 1 lukas staff 447164 28 Apr 19:07 compact_monitor_1_1777392469679.mp4\n-rw-r--r-- 1 lukas staff 442431 28 Apr 19:13 compact_monitor_1_1777392792794.mp4\n-rw-r--r-- 1 lukas staff 436805 28 Apr 19:18 compact_monitor_1_1777393109301.mp4\n-rw-r--r-- 1 lukas staff 435633 28 Apr 19:23 compact_monitor_1_1777393423192.mp4\n-rw-r--r-- 1 lukas staff 1162510 28 Apr 09:30 compact_monitor_2_1777357806702.mp4\n-rw-r--r-- 1 lukas staff 3394878 28 Apr 09:35 compact_monitor_2_1777358126186.mp4\n-rw-r--r-- 1 lukas staff 268044 28 Apr 09:40 compact_monitor_2_1777358443280.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 09:46 compact_monitor_2_1777358769231.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 09:51 compact_monitor_2_1777359084493.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 09:56 compact_monitor_2_1777359399758.mp4\n-rw-r--r-- 1 lukas staff 266694 28 Apr 10:01 compact_monitor_2_1777359707884.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 10:06 compact_monitor_2_1777360016892.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 10:12 compact_monitor_2_1777360329199.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 10:17 compact_monitor_2_1777360641498.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 10:22 compact_monitor_2_1777360953971.mp4\n-rw-r--r-- 1 lukas staff 267099 28 Apr 10:27 compact_monitor_2_1777361264266.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 10:33 compact_monitor_2_1777361583211.mp4\n-rw-r--r-- 1 lukas staff 266829 28 Apr 10:38 compact_monitor_2_1777361903545.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 10:43 compact_monitor_2_1777362219032.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 10:48 compact_monitor_2_1777362532674.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 10:54 compact_monitor_2_1777362845950.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 10:59 compact_monitor_2_1777363157577.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 11:04 compact_monitor_2_1777363473776.mp4\n-rw-r--r-- 1 lukas staff 267099 28 Apr 11:09 compact_monitor_2_1777363782342.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 11:14 compact_monitor_2_1777364092822.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 11:20 compact_monitor_2_1777364400840.mp4\n-rw-r--r-- 1 lukas staff 266694 28 Apr 11:25 compact_monitor_2_1777364709144.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 11:30 compact_monitor_2_1777365022090.mp4\n-rw-r--r-- 1 lukas staff 264669 28 Apr 11:35 compact_monitor_2_1777365335928.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 11:40 compact_monitor_2_1777365649137.mp4\n-rw-r--r-- 1 lukas staff 266964 28 Apr 11:46 compact_monitor_2_1777365962619.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 11:51 compact_monitor_2_1777366273740.mp4\n-rw-r--r-- 1 lukas staff 265209 28 Apr 11:56 compact_monitor_2_1777366582034.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 12:01 compact_monitor_2_1777366886631.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 12:06 compact_monitor_2_1777367202805.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 12:11 compact_monitor_2_1777367518861.mp4\n-rw-r--r-- 1 lukas staff 269261 28 Apr 12:17 compact_monitor_2_1777367837441.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 12:22 compact_monitor_2_1777368160952.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 12:28 compact_monitor_2_1777368477571.mp4\n-rw-r--r-- 1 lukas staff 267234 28 Apr 12:33 compact_monitor_2_1777368792600.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 12:38 compact_monitor_2_1777369107069.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 12:43 compact_monitor_2_1777369421530.mp4\n-rw-r--r-- 1 lukas staff 266829 28 Apr 12:48 compact_monitor_2_1777369731189.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 12:54 compact_monitor_2_1777370048214.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 12:59 compact_monitor_2_1777370363567.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 13:04 compact_monitor_2_1777370679314.mp4\n-rw-r--r-- 1 lukas staff 268855 28 Apr 13:09 compact_monitor_2_1777370994284.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 13:15 compact_monitor_2_1777371309064.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 13:20 compact_monitor_2_1777371623643.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 13:25 compact_monitor_2_1777371938006.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 13:30 compact_monitor_2_1777372252120.mp4\n-rw-r--r-- 1 lukas staff 266964 28 Apr 13:36 compact_monitor_2_1777372566394.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 13:41 compact_monitor_2_1777372880197.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 13:46 compact_monitor_2_1777373193667.mp4\n-rw-r--r-- 1 lukas staff 265209 28 Apr 13:51 compact_monitor_2_1777373506832.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 13:56 compact_monitor_2_1777373816197.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 14:02 compact_monitor_2_1777374130774.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 14:07 compact_monitor_2_1777374443527.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 14:12 compact_monitor_2_1777374756405.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 14:17 compact_monitor_2_1777375070551.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 14:23 compact_monitor_2_1777375397987.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 14:28 compact_monitor_2_1777375715930.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 14:33 compact_monitor_2_1777376034152.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 14:39 compact_monitor_2_1777376348246.mp4\n-rw-r--r-- 1 lukas staff 266019 28 Apr 14:44 compact_monitor_2_1777376657026.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 14:49 compact_monitor_2_1777376966683.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 14:54 compact_monitor_2_1777377280571.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:00 compact_monitor_2_1777377602616.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:05 compact_monitor_2_1777377915467.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 15:10 compact_monitor_2_1777378232424.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 15:15 compact_monitor_2_1777378547117.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:21 compact_monitor_2_1777378865359.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 15:26 compact_monitor_2_1777379183376.mp4\n-rw-r--r-- 1 lukas staff 267774 28 Apr 15:31 compact_monitor_2_1777379502714.mp4\n-rw-r--r-- 1 lukas staff 268046 28 Apr 15:37 compact_monitor_2_1777379819259.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 15:42 compact_monitor_2_1777380134674.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 15:47 compact_monitor_2_1777380454708.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 15:52 compact_monitor_2_1777380771150.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 15:58 compact_monitor_2_1777381086934.mp4\n-rw-r--r-- 1 lukas staff 268044 28 Apr 16:03 compact_monitor_2_1777381401816.mp4\n-rw-r--r-- 1 lukas staff 269530 28 Apr 16:08 compact_monitor_2_1777381720100.mp4\n-rw-r--r-- 1 lukas staff 268721 28 Apr 16:13 compact_monitor_2_1777382037168.mp4\n-rw-r--r-- 1 lukas staff 268583 28 Apr 16:19 compact_monitor_2_1777382355014.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 16:24 compact_monitor_2_1777382670965.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 16:29 compact_monitor_2_1777382984987.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 16:34 compact_monitor_2_1777383298084.mp4\n-rw-r--r-- 1 lukas staff 236209 28 Apr 16:40 compact_monitor_2_1777383610070.mp4\n-rw-r--r-- 1 lukas staff 1191690 28 Apr 17:01 compact_monitor_2_1777384877981.mp4\n-rw-r--r-- 1 lukas staff 2975861 28 Apr 17:06 compact_monitor_2_1777385201736.mp4\n-rw-r--r-- 1 lukas staff 5319560 28 Apr 17:12 compact_monitor_2_1777385529432.mp4\n-rw-r--r-- 1 lukas staff 3006284 28 Apr 17:18 compact_monitor_2_1777385870812.mp4\n-rw-r--r-- 1 lukas staff 2726877 28 Apr 17:23 compact_monitor_2_1777386204715.mp4\n-rw-r--r-- 1 lukas staff 3315722 28 Apr 17:29 compact_monitor_2_1777386541280.mp4\n-rw-r--r-- 1 lukas staff 1577465 28 Apr 17:34 compact_monitor_2_1777386883461.mp4\n-rw-r--r-- 1 lukas staff 1745214 28 Apr 17:40 compact_monitor_2_1777387214543.mp4\n-rw-r--r-- 1 lukas staff 950993 28 Apr 17:45 compact_monitor_2_1777387552842.mp4\n-rw-r--r-- 1 lukas staff 429007 28 Apr 17:51 compact_monitor_2_1777387889075.mp4\n-rw-r--r-- 1 lukas staff 884099 28 Apr 17:57 compact_monitor_2_1777388218623.mp4\n-rw-r--r-- 1 lukas staff 2352504 28 Apr 18:02 compact_monitor_2_1777388548021.mp4\n-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4\n-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4\n-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4\n-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4\n-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4\n-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4\n-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4\n-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4\n-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4\n-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4\n-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4\n-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4\n-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4\n-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4\n-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22523176\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 28 Apr 16:51 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite\n-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27 \n[2026-05-06 18:58:18] ========================================\n[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 18:58:18] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m04s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m06s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m07s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)\n frames (7543 rows) ⠴ % \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27\n[2026-05-06 19:22:16] ========================================\n[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 19:22:16] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m01s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m03s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ✓ 4m40s\n ocr_text (2193 rows) ✓ 0m25s\n ui_events (9909 rows) ✓ 0m02s\n elements (470235 rows) ✓ 2m46s\n meetings (3 rows) ✓ 0m00s\n\n[+08m07s] ▶ Updating FTS indexes\n elements_fts ✓ 2m59s\n frames_fts ✓ 6m07s\n ui_events_fts ✓ 0m03s\n\n[+17m16s] ▶ Verifying DB\n frames: 7543 / 7543 ✓\n elements: 470235 / 470235 ✓\n ui_events: 9909 / 9909 ✓\n ocr_text: 2193 / 2193 ✓\n meetings: 3 / 3 ✓\n\n[+18m46s] ▶ Copying data folder for 2026-04-27\n rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)\n\n[2026-05-06 19:41:28] Archive DB size: 9.7G\n[2026-05-06 19:41:28] Total time: 19m12s\n[2026-05-06 19:41:28] Sync complete for 2026-04-27\n[2026-05-06 19:41:28] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28\n[2026-05-06 19:44:49] ========================================\n[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28\n[2026-05-06 19:44:49] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (9.7G)\n Data dir: OK (223 files, 159M)\n\n[+00m00s] ▶ Counting source rows for 2026-04-28\n frames: 4535\n elements: 407532\n ui_events: 8621\n ocr_text: 1623\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m00s\n creating FTS tables ✓ 0m00s\n\n[+00m02s] ▶ Syncing data for 2026-04-28\n video_chunks ✓ 0m12s\n frames (4535 rows) ✓ 1m30s\n ocr_text (1623 rows) ✓ 0m32s\n ui_events (8621 rows) ✓ 0m01s\n elements (407532 rows) ✓ 1m02s\n meetings (3 rows) ✓ 0m00s\n\n[+03m19s] ▶ Updating FTS indexes\n elements_fts ✓ 1m36s\n frames_fts ✓ 2m28s\n ui_events_fts ✓ 0m04s\n\n[+07m27s] ▶ Verifying DB\n frames: 4535 / 4535 ✓\n elements: 407532 / 407532 ✓\n ui_events: 8621 / 8621 ✓\n ocr_text: 1623 / 1623 ✓\n meetings: 3 / 3 ✓\n\n[+08m59s] ▶ Copying data folder for 2026-04-28\n rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)\n\n[2026-05-06 19:54:08] Archive DB size: 10G\n[2026-05-06 19:54:08] Total time: 9m19s\n[2026-05-06 19:54:08] Sync complete for 2026-04-28\n[2026-05-06 19:54:08] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll\ntotal 24\ndrwx------ 9 lukas staff 288 28 Apr 09:18 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\ndrwx------ 5 lukas staff 160 1 Nov 2021 _cacache\ndrwx------@ 2 lukas staff 64 28 Apr 09:18 _locks\ndrwx------ 15 lukas staff 480 27 Apr 19:54 _logs\ndrwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx\n-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked\n-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json\n-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll \ntotal 52920\ndrwx------+ 92 lukas staff 2944 6 May 20:22 .\ndrwxr-xr-x 5 root admin 160 23 Aug 2024 ..\n-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding\n-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store\ndrwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash\ndrwx------ 5 lukas staff 160 1 Nov 2021 .aws\n-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json\n-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history\n-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc\ndrwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito\ndrwx------@ 6 lukas staff 192 9 Apr 19:53 .cache\ndrwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude\n-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json\ndrwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium\ndrwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer\ndrwx------ 16 lukas staff 512 21 May 2025 .config\ndrwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue\ndrwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot\ndrwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor\ndrwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor\ndrwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona\ndrwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb\ndrwx------ 24 lukas staff 768 27 Apr 18:14 .docker\ndrwx------ 15 lukas staff 480 6 Jun 2023 .dropbox\ndrwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak\n-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth\n-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig\n-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp\ndrwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon\ndrwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc\n-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst\ndrwx------ 5 lukas staff 160 23 Dec 2024 .local\n-rw------- 1 lukas staff 204 16 Mar 2024 .netrc\ndrwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp\n-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history\n-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer\ndrwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py\ndrwx------ 8 lukas staff 256 6 May 20:24 .npm\n-rw------- 1 lukas staff 74 20 May 2024 .npmrc\ndrwx------ 32 lukas staff 1024 25 Jul 2025 .nvm\ndrwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile\n-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history\ndrwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode\ndrwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight\ndrwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint\ndrwx------ 15 lukas staff 480 8 Aug 2025 .ssh\ndrwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit\ndrwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm\n-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\n UW PICO 5.09 New Buffer \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n [ Read 1 line ] \n^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos \n^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell \ndrwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm\ndrwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf\ndrwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn\n-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc\n-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile\n-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy\n-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave\n-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save\n-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees\n-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc\ndrwx------@ 9 lukas staff 288 20 Apr 20:55 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV\ndrwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads\ndrwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen\ndrwx------@ 112 lukas staff 3584 2 Dec 09:19 Library\ndrwx------ 7 lukas staff 224 12 Feb 2024 Movies\ndrwx------+ 5 lukas staff 160 25 Sep 2023 Music\ndrwx------+ 9 lukas staff 288 25 Sep 2023 Pictures\ndrwx------ 3 lukas staff 96 8 Nov 2021 Postman\ndrwx------+ 4 lukas staff 128 28 Oct 2021 Public\n-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf\ndrwx------ 4 lukas staff 128 2 Jul 2023 Users\n-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log\n-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 2025 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast\n-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin\n-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh\n-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe\ncd: no such file or directory: /Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated\nchecking permissions...\n screen recording: ok\n microphone: ok\n accessibility: ok\n2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap\n2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update\n2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits\n2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown\n2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export\n2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary\n2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ false │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n│ retention mode │ media-only (keep transcripts) │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ MacBook Pro Microphone (input) │\n│ │ System Audio (output) │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-05-06T20:27:34.638384Z INFO screenpipe: starting UI event capture\n2026-05-06T20:27:34.637679Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-05-06T20:27:34.649154Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(94))\n2026-05-06T20:27:34.652794Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-05-06T20:27:34.655839Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-05-06T20:27:34.673877Z INFO screenpipe_engine::ui_recorder: UI recording session started: 54869993-7b4b-491f-b717-2a583517f9c5\n2026-05-06T20:27:34.673910Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-05-06T20:27:34.674057Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-05-05 17:27:34.674056 UTC to 2026-05-06 17:27:34.674056 UTC)\n2026-05-06T20:27:34.674892Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-05-06T20:27:34.675788Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 0 frame entries, coverage from 2026-05-05 17:27:34.674056 UTC\n2026-05-06T20:27:34.686546Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-05-06T20:27:34.691371Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-05-06T20:27:36.270608Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-05-06T20:27:36.270669Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.270714Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.932583Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-05-06T20:27:36.932852Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-05-06T20:27:36.932882Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-05-06T20:27:36.932899Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-05-06T20:27:36.932901Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-05-06T20:27:39.158281Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 3 excluded)","is_focused":true},{"role":"AXTextField","text":"you","depth":3,"bounds":{"left":0.7888889,"top":0.10555556,"width":0.13055556,"height":0.024444444},"on_screen":true,"automation_id":"_NS:65","value":"you","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.7902778,"top":0.10555556,"width":0.017361112,"height":0.024444444},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.9013889,"top":0.10555556,"width":0.015277778,"height":0.024444444},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.925,"top":0.10666667,"width":0.014583333,"height":0.023333333},"on_screen":true,"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.93958336,"top":0.10666667,"width":0.014583333,"height":0.023333333},"on_screen":true,"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.47083333,"top":0.033333335,"width":0.058333334,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-3175729714503896221
|
2903879591132052497
|
manual
|
accessibility
|
NULL
|
-rw-r--r-- 1 lukas staff 659494 28 Apr 10:38 -rw-r--r-- 1 lukas staff 659494 28 Apr 10:38 compact_monitor_1_1777361899343.mp4
-rw-r--r-- 1 lukas staff 659619 28 Apr 10:43 compact_monitor_1_1777362216761.mp4
-rw-r--r-- 1 lukas staff 658369 28 Apr 10:48 compact_monitor_1_1777362531562.mp4
-rw-r--r-- 1 lukas staff 658744 28 Apr 10:54 compact_monitor_1_1777362844570.mp4
-rw-r--r-- 1 lukas staff 658494 28 Apr 10:59 compact_monitor_1_1777363156173.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 11:04 compact_monitor_1_1777363471960.mp4
-rw-r--r-- 1 lukas staff 659244 28 Apr 11:09 compact_monitor_1_1777363780754.mp4
-rw-r--r-- 1 lukas staff 658119 28 Apr 11:14 compact_monitor_1_1777364091631.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 11:20 compact_monitor_1_1777364399949.mp4
-rw-r--r-- 1 lukas staff 658994 28 Apr 11:25 compact_monitor_1_1777364707696.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 11:30 compact_monitor_1_1777365021138.mp4
-rw-r--r-- 1 lukas staff 657494 28 Apr 11:35 compact_monitor_1_1777365334863.mp4
-rw-r--r-- 1 lukas staff 658744 28 Apr 11:40 compact_monitor_1_1777365647363.mp4
-rw-r--r-- 1 lukas staff 659619 28 Apr 11:46 compact_monitor_1_1777365960793.mp4
-rw-r--r-- 1 lukas staff 658369 28 Apr 11:51 compact_monitor_1_1777366272670.mp4
-rw-r--r-- 1 lukas staff 657869 28 Apr 11:56 compact_monitor_1_1777366581087.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 12:01 compact_monitor_1_1777366885670.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 12:06 compact_monitor_1_1777367201821.mp4
-rw-r--r-- 1 lukas staff 657994 28 Apr 12:11 compact_monitor_1_1777367517013.mp4
-rw-r--r-- 1 lukas staff 661994 28 Apr 12:17 compact_monitor_1_1777367833288.mp4
-rw-r--r-- 1 lukas staff 658869 28 Apr 12:22 compact_monitor_1_1777368158856.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 12:27 compact_monitor_1_1777368475271.mp4
-rw-r--r-- 1 lukas staff 659994 28 Apr 12:33 compact_monitor_1_1777368789494.mp4
-rw-r--r-- 1 lukas staff 658744 28 Apr 12:38 compact_monitor_1_1777369105746.mp4
-rw-r--r-- 1 lukas staff 658244 28 Apr 12:43 compact_monitor_1_1777369420420.mp4
-rw-r--r-- 1 lukas staff 659244 28 Apr 12:48 compact_monitor_1_1777369728628.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 12:54 compact_monitor_1_1777370046041.mp4
-rw-r--r-- 1 lukas staff 657869 28 Apr 12:59 compact_monitor_1_1777370361638.mp4
-rw-r--r-- 1 lukas staff 658994 28 Apr 13:04 compact_monitor_1_1777370677661.mp4
-rw-r--r-- 1 lukas staff 660995 28 Apr 13:09 compact_monitor_1_1777370991662.mp4
-rw-r--r-- 1 lukas staff 658619 28 Apr 13:15 compact_monitor_1_1777371307758.mp4
-rw-r--r-- 1 lukas staff 659119 28 Apr 13:20 compact_monitor_1_1777371622003.mp4
-rw-r--r-- 1 lukas staff 659119 28 Apr 13:25 compact_monitor_1_1777371936310.mp4
-rw-r--r-- 1 lukas staff 658119 28 Apr 13:30 compact_monitor_1_1777372250913.mp4
-rw-r--r-- 1 lukas staff 659869 28 Apr 13:36 compact_monitor_1_1777372563723.mp4
-rw-r--r-- 1 lukas staff 658619 28 Apr 13:41 compact_monitor_1_1777372878952.mp4
-rw-r--r-- 1 lukas staff 658119 28 Apr 13:46 compact_monitor_1_1777373192385.mp4
-rw-r--r-- 1 lukas staff 658119 28 Apr 13:51 compact_monitor_1_1777373505576.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 13:56 compact_monitor_1_1777373815249.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 14:02 compact_monitor_1_1777374129679.mp4
-rw-r--r-- 1 lukas staff 657869 28 Apr 14:07 compact_monitor_1_1777374442607.mp4
-rw-r--r-- 1 lukas staff 658619 28 Apr 14:12 compact_monitor_1_1777374754971.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 14:17 compact_monitor_1_1777375068922.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 14:23 compact_monitor_1_1777375395803.mp4
-rw-r--r-- 1 lukas staff 659619 28 Apr 14:28 compact_monitor_1_1777375713843.mp4
-rw-r--r-- 1 lukas staff 658869 28 Apr 14:33 compact_monitor_1_1777376032046.mp4
-rw-r--r-- 1 lukas staff 659494 28 Apr 14:39 compact_monitor_1_1777376346251.mp4
-rw-r--r-- 1 lukas staff 658744 28 Apr 14:44 compact_monitor_1_1777376655731.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 14:49 compact_monitor_1_1777376965747.mp4
-rw-r--r-- 1 lukas staff 658869 28 Apr 14:54 compact_monitor_1_1777377278905.mp4
-rw-r--r-- 1 lukas staff 658869 28 Apr 15:00 compact_monitor_1_1777377599386.mp4
-rw-r--r-- 1 lukas staff 659494 28 Apr 15:05 compact_monitor_1_1777377913234.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 15:10 compact_monitor_1_1777378230148.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 15:15 compact_monitor_1_1777378546013.mp4
-rw-r--r-- 1 lukas staff 658994 28 Apr 15:21 compact_monitor_1_1777378863028.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 15:26 compact_monitor_1_1777379181829.mp4
-rw-r--r-- 1 lukas staff 660244 28 Apr 15:31 compact_monitor_1_1777379498541.mp4
-rw-r--r-- 1 lukas staff 661370 28 Apr 15:36 compact_monitor_1_1777379816522.mp4
-rw-r--r-- 1 lukas staff 657994 28 Apr 15:42 compact_monitor_1_1777380132952.mp4
-rw-r--r-- 1 lukas staff 658494 28 Apr 15:47 compact_monitor_1_1777380451138.mp4
-rw-r--r-- 1 lukas staff 658119 28 Apr 15:52 compact_monitor_1_1777380769459.mp4
-rw-r--r-- 1 lukas staff 658869 28 Apr 15:58 compact_monitor_1_1777381085241.mp4
-rw-r--r-- 1 lukas staff 660245 28 Apr 16:03 compact_monitor_1_1777381399658.mp4
-rw-r--r-- 1 lukas staff 661870 28 Apr 16:08 compact_monitor_1_1777381716781.mp4
-rw-r--r-- 1 lukas staff 661620 28 Apr 16:13 compact_monitor_1_1777382034411.mp4
-rw-r--r-- 1 lukas staff 661118 28 Apr 16:19 compact_monitor_1_1777382351932.mp4
-rw-r--r-- 1 lukas staff 659369 28 Apr 16:24 compact_monitor_1_1777382669035.mp4
-rw-r--r-- 1 lukas staff 659119 28 Apr 16:29 compact_monitor_1_1777382983556.mp4
-rw-r--r-- 1 lukas staff 657869 28 Apr 16:34 compact_monitor_1_1777383297132.mp4
-rw-r--r-- 1 lukas staff 606367 28 Apr 16:40 compact_monitor_1_1777383609588.mp4
-rw-r--r-- 1 lukas staff 397068 28 Apr 17:01 compact_monitor_1_1777384874970.mp4
-rw-r--r-- 1 lukas staff 1592462 28 Apr 17:06 compact_monitor_1_1777385198571.mp4
-rw-r--r-- 1 lukas staff 1327809 28 Apr 17:12 compact_monitor_1_1777385523980.mp4
-rw-r--r-- 1 lukas staff 2262498 28 Apr 17:17 compact_monitor_1_1777385864559.mp4
-rw-r--r-- 1 lukas staff 1702453 28 Apr 17:23 compact_monitor_1_1777386198870.mp4
-rw-r--r-- 1 lukas staff 2034287 28 Apr 17:29 compact_monitor_1_1777386532344.mp4
-rw-r--r-- 1 lukas staff 1352893 28 Apr 17:34 compact_monitor_1_1777386875277.mp4
-rw-r--r-- 1 lukas staff 1873946 28 Apr 17:40 compact_monitor_1_1777387208685.mp4
-rw-r--r-- 1 lukas staff 1155463 28 Apr 17:45 compact_monitor_1_1777387548798.mp4
-rw-r--r-- 1 lukas staff 1428159 28 Apr 17:51 compact_monitor_1_1777387882691.mp4
-rw-r--r-- 1 lukas staff 1398484 28 Apr 17:56 compact_monitor_1_1777388213861.mp4
-rw-r--r-- 1 lukas staff 1688438 28 Apr 18:02 compact_monitor_1_1777388542869.mp4
-rw-r--r-- 1 lukas staff 2401161 28 Apr 18:07 compact_monitor_1_1777388869470.mp4
-rw-r--r-- 1 lukas staff 1283247 28 Apr 18:13 compact_monitor_1_1777389192202.mp4
-rw-r--r-- 1 lukas staff 1398160 28 Apr 18:18 compact_monitor_1_1777389525394.mp4
-rw-r--r-- 1 lukas staff 452906 28 Apr 18:24 compact_monitor_1_1777389856559.mp4
-rw-r--r-- 1 lukas staff 566518 28 Apr 18:29 compact_monitor_1_1777390191054.mp4
-rw-r--r-- 1 lukas staff 445894 28 Apr 18:35 compact_monitor_1_1777390513567.mp4
-rw-r--r-- 1 lukas staff 444044 28 Apr 18:40 compact_monitor_1_1777390841877.mp4
-rw-r--r-- 1 lukas staff 437853 28 Apr 18:46 compact_monitor_1_1777391162552.mp4
-rw-r--r-- 1 lukas staff 441008 28 Apr 18:51 compact_monitor_1_1777391489107.mp4
-rw-r--r-- 1 lukas staff 443934 28 Apr 18:57 compact_monitor_1_1777391823165.mp4
-rw-r--r-- 1 lukas staff 443624 28 Apr 19:02 compact_monitor_1_1777392146221.mp4
-rw-r--r-- 1 lukas staff 447164 28 Apr 19:07 compact_monitor_1_1777392469679.mp4
-rw-r--r-- 1 lukas staff 442431 28 Apr 19:13 compact_monitor_1_1777392792794.mp4
-rw-r--r-- 1 lukas staff 436805 28 Apr 19:18 compact_monitor_1_1777393109301.mp4
-rw-r--r-- 1 lukas staff 435633 28 Apr 19:23 compact_monitor_1_1777393423192.mp4
-rw-r--r-- 1 lukas staff 1162510 28 Apr 09:30 compact_monitor_2_1777357806702.mp4
-rw-r--r-- 1 lukas staff 3394878 28 Apr 09:35 compact_monitor_2_1777358126186.mp4
-rw-r--r-- 1 lukas staff 268044 28 Apr 09:40 compact_monitor_2_1777358443280.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 09:46 compact_monitor_2_1777358769231.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 09:51 compact_monitor_2_1777359084493.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 09:56 compact_monitor_2_1777359399758.mp4
-rw-r--r-- 1 lukas staff 266694 28 Apr 10:01 compact_monitor_2_1777359707884.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 10:06 compact_monitor_2_1777360016892.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 10:12 compact_monitor_2_1777360329199.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 10:17 compact_monitor_2_1777360641498.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 10:22 compact_monitor_2_1777360953971.mp4
-rw-r--r-- 1 lukas staff 267099 28 Apr 10:27 compact_monitor_2_1777361264266.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 10:33 compact_monitor_2_1777361583211.mp4
-rw-r--r-- 1 lukas staff 266829 28 Apr 10:38 compact_monitor_2_1777361903545.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 10:43 compact_monitor_2_1777362219032.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 10:48 compact_monitor_2_1777362532674.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 10:54 compact_monitor_2_1777362845950.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 10:59 compact_monitor_2_1777363157577.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 11:04 compact_monitor_2_1777363473776.mp4
-rw-r--r-- 1 lukas staff 267099 28 Apr 11:09 compact_monitor_2_1777363782342.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 11:14 compact_monitor_2_1777364092822.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 11:20 compact_monitor_2_1777364400840.mp4
-rw-r--r-- 1 lukas staff 266694 28 Apr 11:25 compact_monitor_2_1777364709144.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 11:30 compact_monitor_2_1777365022090.mp4
-rw-r--r-- 1 lukas staff 264669 28 Apr 11:35 compact_monitor_2_1777365335928.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 11:40 compact_monitor_2_1777365649137.mp4
-rw-r--r-- 1 lukas staff 266964 28 Apr 11:46 compact_monitor_2_1777365962619.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 11:51 compact_monitor_2_1777366273740.mp4
-rw-r--r-- 1 lukas staff 265209 28 Apr 11:56 compact_monitor_2_1777366582034.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 12:01 compact_monitor_2_1777366886631.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 12:06 compact_monitor_2_1777367202805.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 12:11 compact_monitor_2_1777367518861.mp4
-rw-r--r-- 1 lukas staff 269261 28 Apr 12:17 compact_monitor_2_1777367837441.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 12:22 compact_monitor_2_1777368160952.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 12:28 compact_monitor_2_1777368477571.mp4
-rw-r--r-- 1 lukas staff 267234 28 Apr 12:33 compact_monitor_2_1777368792600.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 12:38 compact_monitor_2_1777369107069.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 12:43 compact_monitor_2_1777369421530.mp4
-rw-r--r-- 1 lukas staff 266829 28 Apr 12:48 compact_monitor_2_1777369731189.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 12:54 compact_monitor_2_1777370048214.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 12:59 compact_monitor_2_1777370363567.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 13:04 compact_monitor_2_1777370679314.mp4
-rw-r--r-- 1 lukas staff 268855 28 Apr 13:09 compact_monitor_2_1777370994284.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 13:15 compact_monitor_2_1777371309064.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 13:20 compact_monitor_2_1777371623643.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 13:25 compact_monitor_2_1777371938006.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 13:30 compact_monitor_2_1777372252120.mp4
-rw-r--r-- 1 lukas staff 266964 28 Apr 13:36 compact_monitor_2_1777372566394.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 13:41 compact_monitor_2_1777372880197.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 13:46 compact_monitor_2_1777373193667.mp4
-rw-r--r-- 1 lukas staff 265209 28 Apr 13:51 compact_monitor_2_1777373506832.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 13:56 compact_monitor_2_1777373816197.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 14:02 compact_monitor_2_1777374130774.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 14:07 compact_monitor_2_1777374443527.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 14:12 compact_monitor_2_1777374756405.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 14:17 compact_monitor_2_1777375070551.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 14:23 compact_monitor_2_1777375397987.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 14:28 compact_monitor_2_1777375715930.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 14:33 compact_monitor_2_1777376034152.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 14:39 compact_monitor_2_1777376348246.mp4
-rw-r--r-- 1 lukas staff 266019 28 Apr 14:44 compact_monitor_2_1777376657026.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 14:49 compact_monitor_2_1777376966683.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 14:54 compact_monitor_2_1777377280571.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:00 compact_monitor_2_1777377602616.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:05 compact_monitor_2_1777377915467.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 15:10 compact_monitor_2_1777378232424.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 15:15 compact_monitor_2_1777378547117.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:21 compact_monitor_2_1777378865359.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 15:26 compact_monitor_2_1777379183376.mp4
-rw-r--r-- 1 lukas staff 267774 28 Apr 15:31 compact_monitor_2_1777379502714.mp4
-rw-r--r-- 1 lukas staff 268046 28 Apr 15:37 compact_monitor_2_1777379819259.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 15:42 compact_monitor_2_1777380134674.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 15:47 compact_monitor_2_1777380454708.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 15:52 compact_monitor_2_1777380771150.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 15:58 compact_monitor_2_1777381086934.mp4
-rw-r--r-- 1 lukas staff 268044 28 Apr 16:03 compact_monitor_2_1777381401816.mp4
-rw-r--r-- 1 lukas staff 269530 28 Apr 16:08 compact_monitor_2_1777381720100.mp4
-rw-r--r-- 1 lukas staff 268721 28 Apr 16:13 compact_monitor_2_1777382037168.mp4
-rw-r--r-- 1 lukas staff 268583 28 Apr 16:19 compact_monitor_2_1777382355014.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 16:24 compact_monitor_2_1777382670965.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 16:29 compact_monitor_2_1777382984987.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 16:34 compact_monitor_2_1777383298084.mp4
-rw-r--r-- 1 lukas staff 236209 28 Apr 16:40 compact_monitor_2_1777383610070.mp4
-rw-r--r-- 1 lukas staff 1191690 28 Apr 17:01 compact_monitor_2_1777384877981.mp4
-rw-r--r-- 1 lukas staff 2975861 28 Apr 17:06 compact_monitor_2_1777385201736.mp4
-rw-r--r-- 1 lukas staff 5319560 28 Apr 17:12 compact_monitor_2_1777385529432.mp4
-rw-r--r-- 1 lukas staff 3006284 28 Apr 17:18 compact_monitor_2_1777385870812.mp4
-rw-r--r-- 1 lukas staff 2726877 28 Apr 17:23 compact_monitor_2_1777386204715.mp4
-rw-r--r-- 1 lukas staff 3315722 28 Apr 17:29 compact_monitor_2_1777386541280.mp4
-rw-r--r-- 1 lukas staff 1577465 28 Apr 17:34 compact_monitor_2_1777386883461.mp4
-rw-r--r-- 1 lukas staff 1745214 28 Apr 17:40 compact_monitor_2_1777387214543.mp4
-rw-r--r-- 1 lukas staff 950993 28 Apr 17:45 compact_monitor_2_1777387552842.mp4
-rw-r--r-- 1 lukas staff 429007 28 Apr 17:51 compact_monitor_2_1777387889075.mp4
-rw-r--r-- 1 lukas staff 884099 28 Apr 17:57 compact_monitor_2_1777388218623.mp4
-rw-r--r-- 1 lukas staff 2352504 28 Apr 18:02 compact_monitor_2_1777388548021.mp4
-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4
-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4
-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4
-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4
-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4
-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4
-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4
-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4
-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4
-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4
-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4
-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4
-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4
-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4
-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22523176
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 28 Apr 16:51 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite
-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm
-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 18:58:18] ========================================
[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27
[2026-05-06 18:58:18] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m04s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m06s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m07s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)
frames (7543 rows) ⠴ %
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 19:22:16] ========================================
[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27
[2026-05-06 19:22:16] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m01s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m03s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ✓ 4m40s
ocr_text (2193 rows) ✓ 0m25s
ui_events (9909 rows) ✓ 0m02s
elements (470235 rows) ✓ 2m46s
meetings (3 rows) ✓ 0m00s
[+08m07s] ▶ Updating FTS indexes
elements_fts ✓ 2m59s
frames_fts ✓ 6m07s
ui_events_fts ✓ 0m03s
[+17m16s] ▶ Verifying DB
frames: 7543 / 7543 ✓
elements: 470235 / 470235 ✓
ui_events: 9909 / 9909 ✓
ocr_text: 2193 / 2193 ✓
meetings: 3 / 3 ✓
[+18m46s] ▶ Copying data folder for 2026-04-27
rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)
[2026-05-06 19:41:28] Archive DB size: 9.7G
[2026-05-06 19:41:28] Total time: 19m12s
[2026-05-06 19:41:28] Sync complete for 2026-04-27
[2026-05-06 19:41:28] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28
[2026-05-06 19:44:49] ========================================
[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28
[2026-05-06 19:44:49] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (9.7G)
Data dir: OK (223 files, 159M)
[+00m00s] ▶ Counting source rows for 2026-04-28
frames: 4535
elements: 407532
ui_events: 8621
ocr_text: 1623
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m00s
creating FTS tables ✓ 0m00s
[+00m02s] ▶ Syncing data for 2026-04-28
video_chunks ✓ 0m12s
frames (4535 rows) ✓ 1m30s
ocr_text (1623 rows) ✓ 0m32s
ui_events (8621 rows) ✓ 0m01s
elements (407532 rows) ✓ 1m02s
meetings (3 rows) ✓ 0m00s
[+03m19s] ▶ Updating FTS indexes
elements_fts ✓ 1m36s
frames_fts ✓ 2m28s
ui_events_fts ✓ 0m04s
[+07m27s] ▶ Verifying DB
frames: 4535 / 4535 ✓
elements: 407532 / 407532 ✓
ui_events: 8621 / 8621 ✓
ocr_text: 1623 / 1623 ✓
meetings: 3 / 3 ✓
[+08m59s] ▶ Copying data folder for 2026-04-28
rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)
[2026-05-06 19:54:08] Archive DB size: 10G
[2026-05-06 19:54:08] Total time: 9m19s
[2026-05-06 19:54:08] Sync complete for 2026-04-28
[2026-05-06 19:54:08] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll
total 24
drwx------ 9 lukas staff 288 28 Apr 09:18 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
drwx------ 5 lukas staff 160 1 Nov 2021 _cacache
drwx------@ 2 lukas staff 64 28 Apr 09:18 _locks
drwx------ 15 lukas staff 480 27 Apr 19:54 _logs
drwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx
-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked
-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json
-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 52920
drwx------+ 92 lukas staff 2944 6 May 20:22 .
drwxr-xr-x 5 root admin 160 23 Aug 2024 ..
-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding
-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store
drwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash
drwx------ 5 lukas staff 160 1 Nov 2021 .aws
-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json
-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history
-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc
drwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito
drwx------@ 6 lukas staff 192 9 Apr 19:53 .cache
drwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude
-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json
drwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium
drwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer
drwx------ 16 lukas staff 512 21 May 2025 .config
drwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue
drwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot
drwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor
drwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor
drwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona
drwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb
drwx------ 24 lukas staff 768 27 Apr 18:14 .docker
drwx------ 15 lukas staff 480 6 Jun 2023 .dropbox
drwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak
-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth
-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig
-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp
drwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon
drwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc
-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst
drwx------ 5 lukas staff 160 23 Dec 2024 .local
-rw------- 1 lukas staff 204 16 Mar 2024 .netrc
drwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp
-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history
-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer
drwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py
drwx------ 8 lukas staff 256 6 May 20:24 .npm
-rw------- 1 lukas staff 74 20 May 2024 .npmrc
drwx------ 32 lukas staff 1024 25 Jul 2025 .nvm
drwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile
-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history
drwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode
drwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight
drwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint
drwx------ 15 lukas staff 480 8 Aug 2025 .ssh
drwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit
drwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm
-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
UW PICO 5.09 New Buffer
[ Read 1 line ]
^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos
^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell
drwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm
drwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf
drwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn
-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc
-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile
-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy
-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave
-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save
-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees
-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc
drwx------@ 9 lukas staff 288 20 Apr 20:55 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV
drwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads
drwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen
drwx------@ 112 lukas staff 3584 2 Dec 09:19 Library
drwx------ 7 lukas staff 224 12 Feb 2024 Movies
drwx------+ 5 lukas staff 160 25 Sep 2023 Music
drwx------+ 9 lukas staff 288 25 Sep 2023 Pictures
drwx------ 3 lukas staff 96 8 Nov 2021 Postman
drwx------+ 4 lukas staff 128 28 Oct 2021 Public
-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf
drwx------ 4 lukas staff 128 2 Jul 2023 Users
-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log
-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log
-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4
-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 2025 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast
-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin
-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh
-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
cd: no such file or directory: /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated
checking permissions...
screen recording: ok
microphone: ok
accessibility: ok
2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-05-06T20:27:34.088403Z INFO scree...
|
NULL
|
NULL
|
|
2
|
2
|
0
|
2026-05-06T17:27:37.434975+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778088457434_m2.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
-rw-r--r-- 1 lukas staff 658369 28 Apr 10:48 -rw-r--r-- 1 lukas staff 658369 28 Apr 10:48 compact_monitor_1_1777362531562.mp4
-rw-r--r-- 1 lukas staff 658744 28 Apr 10:54 compact_monitor_1_1777362844570.mp4
-rw-r--r-- 1 lukas staff 658494 28 Apr 10:59 compact_monitor_1_1777363156173.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 11:04 compact_monitor_1_1777363471960.mp4
-rw-r--r-- 1 lukas staff 659244 28 Apr 11:09 compact_monitor_1_1777363780754.mp4
-rw-r--r-- 1 lukas staff 658119 28 Apr 11:14 compact_monitor_1_1777364091631.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 11:20 compact_monitor_1_1777364399949.mp4
-rw-r--r-- 1 lukas staff 658994 28 Apr 11:25 compact_monitor_1_1777364707696.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 11:30 compact_monitor_1_1777365021138.mp4
-rw-r--r-- 1 lukas staff 657494 28 Apr 11:35 compact_monitor_1_1777365334863.mp4
-rw-r--r-- 1 lukas staff 658744 28 Apr 11:40 compact_monitor_1_1777365647363.mp4
-rw-r--r-- 1 lukas staff 659619 28 Apr 11:46 compact_monitor_1_1777365960793.mp4
-rw-r--r-- 1 lukas staff 658369 28 Apr 11:51 compact_monitor_1_1777366272670.mp4
-rw-r--r-- 1 lukas staff 657869 28 Apr 11:56 compact_monitor_1_1777366581087.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 12:01 compact_monitor_1_1777366885670.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 12:06 compact_monitor_1_1777367201821.mp4
-rw-r--r-- 1 lukas staff 657994 28 Apr 12:11 compact_monitor_1_1777367517013.mp4
-rw-r--r-- 1 lukas staff 661994 28 Apr 12:17 compact_monitor_1_1777367833288.mp4
-rw-r--r-- 1 lukas staff 658869 28 Apr 12:22 compact_monitor_1_1777368158856.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 12:27 compact_monitor_1_1777368475271.mp4
-rw-r--r-- 1 lukas staff 659994 28 Apr 12:33 compact_monitor_1_1777368789494.mp4
-rw-r--r-- 1 lukas staff 658744 28 Apr 12:38 compact_monitor_1_1777369105746.mp4
-rw-r--r-- 1 lukas staff 658244 28 Apr 12:43 compact_monitor_1_1777369420420.mp4
-rw-r--r-- 1 lukas staff 659244 28 Apr 12:48 compact_monitor_1_1777369728628.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 12:54 compact_monitor_1_1777370046041.mp4
-rw-r--r-- 1 lukas staff 657869 28 Apr 12:59 compact_monitor_1_1777370361638.mp4
-rw-r--r-- 1 lukas staff 658994 28 Apr 13:04 compact_monitor_1_1777370677661.mp4
-rw-r--r-- 1 lukas staff 660995 28 Apr 13:09 compact_monitor_1_1777370991662.mp4
-rw-r--r-- 1 lukas staff 658619 28 Apr 13:15 compact_monitor_1_1777371307758.mp4
-rw-r--r-- 1 lukas staff 659119 28 Apr 13:20 compact_monitor_1_1777371622003.mp4
-rw-r--r-- 1 lukas staff 659119 28 Apr 13:25 compact_monitor_1_1777371936310.mp4
-rw-r--r-- 1 lukas staff 658119 28 Apr 13:30 compact_monitor_1_1777372250913.mp4
-rw-r--r-- 1 lukas staff 659869 28 Apr 13:36 compact_monitor_1_1777372563723.mp4
-rw-r--r-- 1 lukas staff 658619 28 Apr 13:41 compact_monitor_1_1777372878952.mp4
-rw-r--r-- 1 lukas staff 658119 28 Apr 13:46 compact_monitor_1_1777373192385.mp4
-rw-r--r-- 1 lukas staff 658119 28 Apr 13:51 compact_monitor_1_1777373505576.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 13:56 compact_monitor_1_1777373815249.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 14:02 compact_monitor_1_1777374129679.mp4
-rw-r--r-- 1 lukas staff 657869 28 Apr 14:07 compact_monitor_1_1777374442607.mp4
-rw-r--r-- 1 lukas staff 658619 28 Apr 14:12 compact_monitor_1_1777374754971.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 14:17 compact_monitor_1_1777375068922.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 14:23 compact_monitor_1_1777375395803.mp4
-rw-r--r-- 1 lukas staff 659619 28 Apr 14:28 compact_monitor_1_1777375713843.mp4
-rw-r--r-- 1 lukas staff 658869 28 Apr 14:33 compact_monitor_1_1777376032046.mp4
-rw-r--r-- 1 lukas staff 659494 28 Apr 14:39 compact_monitor_1_1777376346251.mp4
-rw-r--r-- 1 lukas staff 658744 28 Apr 14:44 compact_monitor_1_1777376655731.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 14:49 compact_monitor_1_1777376965747.mp4
-rw-r--r-- 1 lukas staff 658869 28 Apr 14:54 compact_monitor_1_1777377278905.mp4
-rw-r--r-- 1 lukas staff 658869 28 Apr 15:00 compact_monitor_1_1777377599386.mp4
-rw-r--r-- 1 lukas staff 659494 28 Apr 15:05 compact_monitor_1_1777377913234.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 15:10 compact_monitor_1_1777378230148.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 15:15 compact_monitor_1_1777378546013.mp4
-rw-r--r-- 1 lukas staff 658994 28 Apr 15:21 compact_monitor_1_1777378863028.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 15:26 compact_monitor_1_1777379181829.mp4
-rw-r--r-- 1 lukas staff 660244 28 Apr 15:31 compact_monitor_1_1777379498541.mp4
-rw-r--r-- 1 lukas staff 661370 28 Apr 15:36 compact_monitor_1_1777379816522.mp4
-rw-r--r-- 1 lukas staff 657994 28 Apr 15:42 compact_monitor_1_1777380132952.mp4
-rw-r--r-- 1 lukas staff 658494 28 Apr 15:47 compact_monitor_1_1777380451138.mp4
-rw-r--r-- 1 lukas staff 658119 28 Apr 15:52 compact_monitor_1_1777380769459.mp4
-rw-r--r-- 1 lukas staff 658869 28 Apr 15:58 compact_monitor_1_1777381085241.mp4
-rw-r--r-- 1 lukas staff 660245 28 Apr 16:03 compact_monitor_1_1777381399658.mp4
-rw-r--r-- 1 lukas staff 661870 28 Apr 16:08 compact_monitor_1_1777381716781.mp4
-rw-r--r-- 1 lukas staff 661620 28 Apr 16:13 compact_monitor_1_1777382034411.mp4
-rw-r--r-- 1 lukas staff 661118 28 Apr 16:19 compact_monitor_1_1777382351932.mp4
-rw-r--r-- 1 lukas staff 659369 28 Apr 16:24 compact_monitor_1_1777382669035.mp4
-rw-r--r-- 1 lukas staff 659119 28 Apr 16:29 compact_monitor_1_1777382983556.mp4
-rw-r--r-- 1 lukas staff 657869 28 Apr 16:34 compact_monitor_1_1777383297132.mp4
-rw-r--r-- 1 lukas staff 606367 28 Apr 16:40 compact_monitor_1_1777383609588.mp4
-rw-r--r-- 1 lukas staff 397068 28 Apr 17:01 compact_monitor_1_1777384874970.mp4
-rw-r--r-- 1 lukas staff 1592462 28 Apr 17:06 compact_monitor_1_1777385198571.mp4
-rw-r--r-- 1 lukas staff 1327809 28 Apr 17:12 compact_monitor_1_1777385523980.mp4
-rw-r--r-- 1 lukas staff 2262498 28 Apr 17:17 compact_monitor_1_1777385864559.mp4
-rw-r--r-- 1 lukas staff 1702453 28 Apr 17:23 compact_monitor_1_1777386198870.mp4
-rw-r--r-- 1 lukas staff 2034287 28 Apr 17:29 compact_monitor_1_1777386532344.mp4
-rw-r--r-- 1 lukas staff 1352893 28 Apr 17:34 compact_monitor_1_1777386875277.mp4
-rw-r--r-- 1 lukas staff 1873946 28 Apr 17:40 compact_monitor_1_1777387208685.mp4
-rw-r--r-- 1 lukas staff 1155463 28 Apr 17:45 compact_monitor_1_1777387548798.mp4
-rw-r--r-- 1 lukas staff 1428159 28 Apr 17:51 compact_monitor_1_1777387882691.mp4
-rw-r--r-- 1 lukas staff 1398484 28 Apr 17:56 compact_monitor_1_1777388213861.mp4
-rw-r--r-- 1 lukas staff 1688438 28 Apr 18:02 compact_monitor_1_1777388542869.mp4
-rw-r--r-- 1 lukas staff 2401161 28 Apr 18:07 compact_monitor_1_1777388869470.mp4
-rw-r--r-- 1 lukas staff 1283247 28 Apr 18:13 compact_monitor_1_1777389192202.mp4
-rw-r--r-- 1 lukas staff 1398160 28 Apr 18:18 compact_monitor_1_1777389525394.mp4
-rw-r--r-- 1 lukas staff 452906 28 Apr 18:24 compact_monitor_1_1777389856559.mp4
-rw-r--r-- 1 lukas staff 566518 28 Apr 18:29 compact_monitor_1_1777390191054.mp4
-rw-r--r-- 1 lukas staff 445894 28 Apr 18:35 compact_monitor_1_1777390513567.mp4
-rw-r--r-- 1 lukas staff 444044 28 Apr 18:40 compact_monitor_1_1777390841877.mp4
-rw-r--r-- 1 lukas staff 437853 28 Apr 18:46 compact_monitor_1_1777391162552.mp4
-rw-r--r-- 1 lukas staff 441008 28 Apr 18:51 compact_monitor_1_1777391489107.mp4
-rw-r--r-- 1 lukas staff 443934 28 Apr 18:57 compact_monitor_1_1777391823165.mp4
-rw-r--r-- 1 lukas staff 443624 28 Apr 19:02 compact_monitor_1_1777392146221.mp4
-rw-r--r-- 1 lukas staff 447164 28 Apr 19:07 compact_monitor_1_1777392469679.mp4
-rw-r--r-- 1 lukas staff 442431 28 Apr 19:13 compact_monitor_1_1777392792794.mp4
-rw-r--r-- 1 lukas staff 436805 28 Apr 19:18 compact_monitor_1_1777393109301.mp4
-rw-r--r-- 1 lukas staff 435633 28 Apr 19:23 compact_monitor_1_1777393423192.mp4
-rw-r--r-- 1 lukas staff 1162510 28 Apr 09:30 compact_monitor_2_1777357806702.mp4
-rw-r--r-- 1 lukas staff 3394878 28 Apr 09:35 compact_monitor_2_1777358126186.mp4
-rw-r--r-- 1 lukas staff 268044 28 Apr 09:40 compact_monitor_2_1777358443280.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 09:46 compact_monitor_2_1777358769231.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 09:51 compact_monitor_2_1777359084493.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 09:56 compact_monitor_2_1777359399758.mp4
-rw-r--r-- 1 lukas staff 266694 28 Apr 10:01 compact_monitor_2_1777359707884.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 10:06 compact_monitor_2_1777360016892.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 10:12 compact_monitor_2_1777360329199.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 10:17 compact_monitor_2_1777360641498.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 10:22 compact_monitor_2_1777360953971.mp4
-rw-r--r-- 1 lukas staff 267099 28 Apr 10:27 compact_monitor_2_1777361264266.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 10:33 compact_monitor_2_1777361583211.mp4
-rw-r--r-- 1 lukas staff 266829 28 Apr 10:38 compact_monitor_2_1777361903545.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 10:43 compact_monitor_2_1777362219032.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 10:48 compact_monitor_2_1777362532674.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 10:54 compact_monitor_2_1777362845950.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 10:59 compact_monitor_2_1777363157577.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 11:04 compact_monitor_2_1777363473776.mp4
-rw-r--r-- 1 lukas staff 267099 28 Apr 11:09 compact_monitor_2_1777363782342.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 11:14 compact_monitor_2_1777364092822.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 11:20 compact_monitor_2_1777364400840.mp4
-rw-r--r-- 1 lukas staff 266694 28 Apr 11:25 compact_monitor_2_1777364709144.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 11:30 compact_monitor_2_1777365022090.mp4
-rw-r--r-- 1 lukas staff 264669 28 Apr 11:35 compact_monitor_2_1777365335928.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 11:40 compact_monitor_2_1777365649137.mp4
-rw-r--r-- 1 lukas staff 266964 28 Apr 11:46 compact_monitor_2_1777365962619.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 11:51 compact_monitor_2_1777366273740.mp4
-rw-r--r-- 1 lukas staff 265209 28 Apr 11:56 compact_monitor_2_1777366582034.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 12:01 compact_monitor_2_1777366886631.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 12:06 compact_monitor_2_1777367202805.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 12:11 compact_monitor_2_1777367518861.mp4
-rw-r--r-- 1 lukas staff 269261 28 Apr 12:17 compact_monitor_2_1777367837441.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 12:22 compact_monitor_2_1777368160952.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 12:28 compact_monitor_2_1777368477571.mp4
-rw-r--r-- 1 lukas staff 267234 28 Apr 12:33 compact_monitor_2_1777368792600.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 12:38 compact_monitor_2_1777369107069.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 12:43 compact_monitor_2_1777369421530.mp4
-rw-r--r-- 1 lukas staff 266829 28 Apr 12:48 compact_monitor_2_1777369731189.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 12:54 compact_monitor_2_1777370048214.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 12:59 compact_monitor_2_1777370363567.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 13:04 compact_monitor_2_1777370679314.mp4
-rw-r--r-- 1 lukas staff 268855 28 Apr 13:09 compact_monitor_2_1777370994284.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 13:15 compact_monitor_2_1777371309064.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 13:20 compact_monitor_2_1777371623643.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 13:25 compact_monitor_2_1777371938006.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 13:30 compact_monitor_2_1777372252120.mp4
-rw-r--r-- 1 lukas staff 266964 28 Apr 13:36 compact_monitor_2_1777372566394.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 13:41 compact_monitor_2_1777372880197.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 13:46 compact_monitor_2_1777373193667.mp4
-rw-r--r-- 1 lukas staff 265209 28 Apr 13:51 compact_monitor_2_1777373506832.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 13:56 compact_monitor_2_1777373816197.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 14:02 compact_monitor_2_1777374130774.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 14:07 compact_monitor_2_1777374443527.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 14:12 compact_monitor_2_1777374756405.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 14:17 compact_monitor_2_1777375070551.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 14:23 compact_monitor_2_1777375397987.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 14:28 compact_monitor_2_1777375715930.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 14:33 compact_monitor_2_1777376034152.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 14:39 compact_monitor_2_1777376348246.mp4
-rw-r--r-- 1 lukas staff 266019 28 Apr 14:44 compact_monitor_2_1777376657026.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 14:49 compact_monitor_2_1777376966683.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 14:54 compact_monitor_2_1777377280571.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:00 compact_monitor_2_1777377602616.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:05 compact_monitor_2_1777377915467.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 15:10 compact_monitor_2_1777378232424.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 15:15 compact_monitor_2_1777378547117.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:21 compact_monitor_2_1777378865359.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 15:26 compact_monitor_2_1777379183376.mp4
-rw-r--r-- 1 lukas staff 267774 28 Apr 15:31 compact_monitor_2_1777379502714.mp4
-rw-r--r-- 1 lukas staff 268046 28 Apr 15:37 compact_monitor_2_1777379819259.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 15:42 compact_monitor_2_1777380134674.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 15:47 compact_monitor_2_1777380454708.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 15:52 compact_monitor_2_1777380771150.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 15:58 compact_monitor_2_1777381086934.mp4
-rw-r--r-- 1 lukas staff 268044 28 Apr 16:03 compact_monitor_2_1777381401816.mp4
-rw-r--r-- 1 lukas staff 269530 28 Apr 16:08 compact_monitor_2_1777381720100.mp4
-rw-r--r-- 1 lukas staff 268721 28 Apr 16:13 compact_monitor_2_1777382037168.mp4
-rw-r--r-- 1 lukas staff 268583 28 Apr 16:19 compact_monitor_2_1777382355014.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 16:24 compact_monitor_2_1777382670965.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 16:29 compact_monitor_2_1777382984987.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 16:34 compact_monitor_2_1777383298084.mp4
-rw-r--r-- 1 lukas staff 236209 28 Apr 16:40 compact_monitor_2_1777383610070.mp4
-rw-r--r-- 1 lukas staff 1191690 28 Apr 17:01 compact_monitor_2_1777384877981.mp4
-rw-r--r-- 1 lukas staff 2975861 28 Apr 17:06 compact_monitor_2_1777385201736.mp4
-rw-r--r-- 1 lukas staff 5319560 28 Apr 17:12 compact_monitor_2_1777385529432.mp4
-rw-r--r-- 1 lukas staff 3006284 28 Apr 17:18 compact_monitor_2_1777385870812.mp4
-rw-r--r-- 1 lukas staff 2726877 28 Apr 17:23 compact_monitor_2_1777386204715.mp4
-rw-r--r-- 1 lukas staff 3315722 28 Apr 17:29 compact_monitor_2_1777386541280.mp4
-rw-r--r-- 1 lukas staff 1577465 28 Apr 17:34 compact_monitor_2_1777386883461.mp4
-rw-r--r-- 1 lukas staff 1745214 28 Apr 17:40 compact_monitor_2_1777387214543.mp4
-rw-r--r-- 1 lukas staff 950993 28 Apr 17:45 compact_monitor_2_1777387552842.mp4
-rw-r--r-- 1 lukas staff 429007 28 Apr 17:51 compact_monitor_2_1777387889075.mp4
-rw-r--r-- 1 lukas staff 884099 28 Apr 17:57 compact_monitor_2_1777388218623.mp4
-rw-r--r-- 1 lukas staff 2352504 28 Apr 18:02 compact_monitor_2_1777388548021.mp4
-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4
-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4
-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4
-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4
-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4
-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4
-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4
-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4
-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4
-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4
-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4
-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4
-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4
-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4
-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22523176
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 28 Apr 16:51 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite
-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm
-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 18:58:18] ========================================
[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27
[2026-05-06 18:58:18] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m04s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m06s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m07s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)
frames (7543 rows) ⠴ %
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 19:22:16] ========================================
[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27
[2026-05-06 19:22:16] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m01s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m03s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ✓ 4m40s
ocr_text (2193 rows) ✓ 0m25s
ui_events (9909 rows) ✓ 0m02s
elements (470235 rows) ✓ 2m46s
meetings (3 rows) ✓ 0m00s
[+08m07s] ▶ Updating FTS indexes
elements_fts ✓ 2m59s
frames_fts ✓ 6m07s
ui_events_fts ✓ 0m03s
[+17m16s] ▶ Verifying DB
frames: 7543 / 7543 ✓
elements: 470235 / 470235 ✓
ui_events: 9909 / 9909 ✓
ocr_text: 2193 / 2193 ✓
meetings: 3 / 3 ✓
[+18m46s] ▶ Copying data folder for 2026-04-27
rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)
[2026-05-06 19:41:28] Archive DB size: 9.7G
[2026-05-06 19:41:28] Total time: 19m12s
[2026-05-06 19:41:28] Sync complete for 2026-04-27
[2026-05-06 19:41:28] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28
[2026-05-06 19:44:49] ========================================
[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28
[2026-05-06 19:44:49] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (9.7G)
Data dir: OK (223 files, 159M)
[+00m00s] ▶ Counting source rows for 2026-04-28
frames: 4535
elements: 407532
ui_events: 8621
ocr_text: 1623
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m00s
creating FTS tables ✓ 0m00s
[+00m02s] ▶ Syncing data for 2026-04-28
video_chunks ✓ 0m12s
frames (4535 rows) ✓ 1m30s
ocr_text (1623 rows) ✓ 0m32s
ui_events (8621 rows) ✓ 0m01s
elements (407532 rows) ✓ 1m02s
meetings (3 rows) ✓ 0m00s
[+03m19s] ▶ Updating FTS indexes
elements_fts ✓ 1m36s
frames_fts ✓ 2m28s
ui_events_fts ✓ 0m04s
[+07m27s] ▶ Verifying DB
frames: 4535 / 4535 ✓
elements: 407532 / 407532 ✓
ui_events: 8621 / 8621 ✓
ocr_text: 1623 / 1623 ✓
meetings: 3 / 3 ✓
[+08m59s] ▶ Copying data folder for 2026-04-28
rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)
[2026-05-06 19:54:08] Archive DB size: 10G
[2026-05-06 19:54:08] Total time: 9m19s
[2026-05-06 19:54:08] Sync complete for 2026-04-28
[2026-05-06 19:54:08] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll
total 24
drwx------ 9 lukas staff 288 28 Apr 09:18 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
drwx------ 5 lukas staff 160 1 Nov 2021 _cacache
drwx------@ 2 lukas staff 64 28 Apr 09:18 _locks
drwx------ 15 lukas staff 480 27 Apr 19:54 _logs
drwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx
-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked
-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json
-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 52920
drwx------+ 92 lukas staff 2944 6 May 20:22 .
drwxr-xr-x 5 root admin 160 23 Aug 2024 ..
-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding
-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store
drwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash
drwx------ 5 lukas staff 160 1 Nov 2021 .aws
-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json
-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history
-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc
drwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito
drwx------@ 6 lukas staff 192 9 Apr 19:53 .cache
drwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude
-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json
drwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium
drwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer
drwx------ 16 lukas staff 512 21 May 2025 .config
drwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue
drwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot
drwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor
drwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor
drwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona
drwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb
drwx------ 24 lukas staff 768 27 Apr 18:14 .docker
drwx------ 15 lukas staff 480 6 Jun 2023 .dropbox
drwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak
-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth
-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig
-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp
drwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon
drwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc
-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst
drwx------ 5 lukas staff 160 23 Dec 2024 .local
-rw------- 1 lukas staff 204 16 Mar 2024 .netrc
drwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp
-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history
-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer
drwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py
drwx------ 8 lukas staff 256 6 May 20:24 .npm
-rw------- 1 lukas staff 74 20 May 2024 .npmrc
drwx------ 32 lukas staff 1024 25 Jul 2025 .nvm
drwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile
-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history
drwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode
drwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight
drwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint
drwx------ 15 lukas staff 480 8 Aug 2025 .ssh
drwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit
drwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm
-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
UW PICO 5.09 New Buffer
[ Read 1 line ]
^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos
^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell
drwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm
drwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf
drwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn
-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc
-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile
-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy
-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave
-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save
-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees
-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc
drwx------@ 9 lukas staff 288 20 Apr 20:55 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV
drwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads
drwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen
drwx------@ 112 lukas staff 3584 2 Dec 09:19 Library
drwx------ 7 lukas staff 224 12 Feb 2024 Movies
drwx------+ 5 lukas staff 160 25 Sep 2023 Music
drwx------+ 9 lukas staff 288 25 Sep 2023 Pictures
drwx------ 3 lukas staff 96 8 Nov 2021 Postman
drwx------+ 4 lukas staff 128 28 Oct 2021 Public
-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf
drwx------ 4 lukas staff 128 2 Jul 2023 Users
-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log
-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log
-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4
-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 2025 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast
-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin
-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh
-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
cd: no such file or directory: /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated
checking permissions...
screen recording: ok
microphone: ok
accessibility: ok
2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CF...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"-rw-r--r-- 1 lukas staff 658369 28 Apr 10:48 compact_monitor_1_1777362531562.mp4\n-rw-r--r-- 1 lukas staff 658744 28 Apr 10:54 compact_monitor_1_1777362844570.mp4\n-rw-r--r-- 1 lukas staff 658494 28 Apr 10:59 compact_monitor_1_1777363156173.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 11:04 compact_monitor_1_1777363471960.mp4\n-rw-r--r-- 1 lukas staff 659244 28 Apr 11:09 compact_monitor_1_1777363780754.mp4\n-rw-r--r-- 1 lukas staff 658119 28 Apr 11:14 compact_monitor_1_1777364091631.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 11:20 compact_monitor_1_1777364399949.mp4\n-rw-r--r-- 1 lukas staff 658994 28 Apr 11:25 compact_monitor_1_1777364707696.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 11:30 compact_monitor_1_1777365021138.mp4\n-rw-r--r-- 1 lukas staff 657494 28 Apr 11:35 compact_monitor_1_1777365334863.mp4\n-rw-r--r-- 1 lukas staff 658744 28 Apr 11:40 compact_monitor_1_1777365647363.mp4\n-rw-r--r-- 1 lukas staff 659619 28 Apr 11:46 compact_monitor_1_1777365960793.mp4\n-rw-r--r-- 1 lukas staff 658369 28 Apr 11:51 compact_monitor_1_1777366272670.mp4\n-rw-r--r-- 1 lukas staff 657869 28 Apr 11:56 compact_monitor_1_1777366581087.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 12:01 compact_monitor_1_1777366885670.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 12:06 compact_monitor_1_1777367201821.mp4\n-rw-r--r-- 1 lukas staff 657994 28 Apr 12:11 compact_monitor_1_1777367517013.mp4\n-rw-r--r-- 1 lukas staff 661994 28 Apr 12:17 compact_monitor_1_1777367833288.mp4\n-rw-r--r-- 1 lukas staff 658869 28 Apr 12:22 compact_monitor_1_1777368158856.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 12:27 compact_monitor_1_1777368475271.mp4\n-rw-r--r-- 1 lukas staff 659994 28 Apr 12:33 compact_monitor_1_1777368789494.mp4\n-rw-r--r-- 1 lukas staff 658744 28 Apr 12:38 compact_monitor_1_1777369105746.mp4\n-rw-r--r-- 1 lukas staff 658244 28 Apr 12:43 compact_monitor_1_1777369420420.mp4\n-rw-r--r-- 1 lukas staff 659244 28 Apr 12:48 compact_monitor_1_1777369728628.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 12:54 compact_monitor_1_1777370046041.mp4\n-rw-r--r-- 1 lukas staff 657869 28 Apr 12:59 compact_monitor_1_1777370361638.mp4\n-rw-r--r-- 1 lukas staff 658994 28 Apr 13:04 compact_monitor_1_1777370677661.mp4\n-rw-r--r-- 1 lukas staff 660995 28 Apr 13:09 compact_monitor_1_1777370991662.mp4\n-rw-r--r-- 1 lukas staff 658619 28 Apr 13:15 compact_monitor_1_1777371307758.mp4\n-rw-r--r-- 1 lukas staff 659119 28 Apr 13:20 compact_monitor_1_1777371622003.mp4\n-rw-r--r-- 1 lukas staff 659119 28 Apr 13:25 compact_monitor_1_1777371936310.mp4\n-rw-r--r-- 1 lukas staff 658119 28 Apr 13:30 compact_monitor_1_1777372250913.mp4\n-rw-r--r-- 1 lukas staff 659869 28 Apr 13:36 compact_monitor_1_1777372563723.mp4\n-rw-r--r-- 1 lukas staff 658619 28 Apr 13:41 compact_monitor_1_1777372878952.mp4\n-rw-r--r-- 1 lukas staff 658119 28 Apr 13:46 compact_monitor_1_1777373192385.mp4\n-rw-r--r-- 1 lukas staff 658119 28 Apr 13:51 compact_monitor_1_1777373505576.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 13:56 compact_monitor_1_1777373815249.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 14:02 compact_monitor_1_1777374129679.mp4\n-rw-r--r-- 1 lukas staff 657869 28 Apr 14:07 compact_monitor_1_1777374442607.mp4\n-rw-r--r-- 1 lukas staff 658619 28 Apr 14:12 compact_monitor_1_1777374754971.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 14:17 compact_monitor_1_1777375068922.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 14:23 compact_monitor_1_1777375395803.mp4\n-rw-r--r-- 1 lukas staff 659619 28 Apr 14:28 compact_monitor_1_1777375713843.mp4\n-rw-r--r-- 1 lukas staff 658869 28 Apr 14:33 compact_monitor_1_1777376032046.mp4\n-rw-r--r-- 1 lukas staff 659494 28 Apr 14:39 compact_monitor_1_1777376346251.mp4\n-rw-r--r-- 1 lukas staff 658744 28 Apr 14:44 compact_monitor_1_1777376655731.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 14:49 compact_monitor_1_1777376965747.mp4\n-rw-r--r-- 1 lukas staff 658869 28 Apr 14:54 compact_monitor_1_1777377278905.mp4\n-rw-r--r-- 1 lukas staff 658869 28 Apr 15:00 compact_monitor_1_1777377599386.mp4\n-rw-r--r-- 1 lukas staff 659494 28 Apr 15:05 compact_monitor_1_1777377913234.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 15:10 compact_monitor_1_1777378230148.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 15:15 compact_monitor_1_1777378546013.mp4\n-rw-r--r-- 1 lukas staff 658994 28 Apr 15:21 compact_monitor_1_1777378863028.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 15:26 compact_monitor_1_1777379181829.mp4\n-rw-r--r-- 1 lukas staff 660244 28 Apr 15:31 compact_monitor_1_1777379498541.mp4\n-rw-r--r-- 1 lukas staff 661370 28 Apr 15:36 compact_monitor_1_1777379816522.mp4\n-rw-r--r-- 1 lukas staff 657994 28 Apr 15:42 compact_monitor_1_1777380132952.mp4\n-rw-r--r-- 1 lukas staff 658494 28 Apr 15:47 compact_monitor_1_1777380451138.mp4\n-rw-r--r-- 1 lukas staff 658119 28 Apr 15:52 compact_monitor_1_1777380769459.mp4\n-rw-r--r-- 1 lukas staff 658869 28 Apr 15:58 compact_monitor_1_1777381085241.mp4\n-rw-r--r-- 1 lukas staff 660245 28 Apr 16:03 compact_monitor_1_1777381399658.mp4\n-rw-r--r-- 1 lukas staff 661870 28 Apr 16:08 compact_monitor_1_1777381716781.mp4\n-rw-r--r-- 1 lukas staff 661620 28 Apr 16:13 compact_monitor_1_1777382034411.mp4\n-rw-r--r-- 1 lukas staff 661118 28 Apr 16:19 compact_monitor_1_1777382351932.mp4\n-rw-r--r-- 1 lukas staff 659369 28 Apr 16:24 compact_monitor_1_1777382669035.mp4\n-rw-r--r-- 1 lukas staff 659119 28 Apr 16:29 compact_monitor_1_1777382983556.mp4\n-rw-r--r-- 1 lukas staff 657869 28 Apr 16:34 compact_monitor_1_1777383297132.mp4\n-rw-r--r-- 1 lukas staff 606367 28 Apr 16:40 compact_monitor_1_1777383609588.mp4\n-rw-r--r-- 1 lukas staff 397068 28 Apr 17:01 compact_monitor_1_1777384874970.mp4\n-rw-r--r-- 1 lukas staff 1592462 28 Apr 17:06 compact_monitor_1_1777385198571.mp4\n-rw-r--r-- 1 lukas staff 1327809 28 Apr 17:12 compact_monitor_1_1777385523980.mp4\n-rw-r--r-- 1 lukas staff 2262498 28 Apr 17:17 compact_monitor_1_1777385864559.mp4\n-rw-r--r-- 1 lukas staff 1702453 28 Apr 17:23 compact_monitor_1_1777386198870.mp4\n-rw-r--r-- 1 lukas staff 2034287 28 Apr 17:29 compact_monitor_1_1777386532344.mp4\n-rw-r--r-- 1 lukas staff 1352893 28 Apr 17:34 compact_monitor_1_1777386875277.mp4\n-rw-r--r-- 1 lukas staff 1873946 28 Apr 17:40 compact_monitor_1_1777387208685.mp4\n-rw-r--r-- 1 lukas staff 1155463 28 Apr 17:45 compact_monitor_1_1777387548798.mp4\n-rw-r--r-- 1 lukas staff 1428159 28 Apr 17:51 compact_monitor_1_1777387882691.mp4\n-rw-r--r-- 1 lukas staff 1398484 28 Apr 17:56 compact_monitor_1_1777388213861.mp4\n-rw-r--r-- 1 lukas staff 1688438 28 Apr 18:02 compact_monitor_1_1777388542869.mp4\n-rw-r--r-- 1 lukas staff 2401161 28 Apr 18:07 compact_monitor_1_1777388869470.mp4\n-rw-r--r-- 1 lukas staff 1283247 28 Apr 18:13 compact_monitor_1_1777389192202.mp4\n-rw-r--r-- 1 lukas staff 1398160 28 Apr 18:18 compact_monitor_1_1777389525394.mp4\n-rw-r--r-- 1 lukas staff 452906 28 Apr 18:24 compact_monitor_1_1777389856559.mp4\n-rw-r--r-- 1 lukas staff 566518 28 Apr 18:29 compact_monitor_1_1777390191054.mp4\n-rw-r--r-- 1 lukas staff 445894 28 Apr 18:35 compact_monitor_1_1777390513567.mp4\n-rw-r--r-- 1 lukas staff 444044 28 Apr 18:40 compact_monitor_1_1777390841877.mp4\n-rw-r--r-- 1 lukas staff 437853 28 Apr 18:46 compact_monitor_1_1777391162552.mp4\n-rw-r--r-- 1 lukas staff 441008 28 Apr 18:51 compact_monitor_1_1777391489107.mp4\n-rw-r--r-- 1 lukas staff 443934 28 Apr 18:57 compact_monitor_1_1777391823165.mp4\n-rw-r--r-- 1 lukas staff 443624 28 Apr 19:02 compact_monitor_1_1777392146221.mp4\n-rw-r--r-- 1 lukas staff 447164 28 Apr 19:07 compact_monitor_1_1777392469679.mp4\n-rw-r--r-- 1 lukas staff 442431 28 Apr 19:13 compact_monitor_1_1777392792794.mp4\n-rw-r--r-- 1 lukas staff 436805 28 Apr 19:18 compact_monitor_1_1777393109301.mp4\n-rw-r--r-- 1 lukas staff 435633 28 Apr 19:23 compact_monitor_1_1777393423192.mp4\n-rw-r--r-- 1 lukas staff 1162510 28 Apr 09:30 compact_monitor_2_1777357806702.mp4\n-rw-r--r-- 1 lukas staff 3394878 28 Apr 09:35 compact_monitor_2_1777358126186.mp4\n-rw-r--r-- 1 lukas staff 268044 28 Apr 09:40 compact_monitor_2_1777358443280.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 09:46 compact_monitor_2_1777358769231.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 09:51 compact_monitor_2_1777359084493.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 09:56 compact_monitor_2_1777359399758.mp4\n-rw-r--r-- 1 lukas staff 266694 28 Apr 10:01 compact_monitor_2_1777359707884.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 10:06 compact_monitor_2_1777360016892.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 10:12 compact_monitor_2_1777360329199.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 10:17 compact_monitor_2_1777360641498.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 10:22 compact_monitor_2_1777360953971.mp4\n-rw-r--r-- 1 lukas staff 267099 28 Apr 10:27 compact_monitor_2_1777361264266.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 10:33 compact_monitor_2_1777361583211.mp4\n-rw-r--r-- 1 lukas staff 266829 28 Apr 10:38 compact_monitor_2_1777361903545.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 10:43 compact_monitor_2_1777362219032.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 10:48 compact_monitor_2_1777362532674.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 10:54 compact_monitor_2_1777362845950.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 10:59 compact_monitor_2_1777363157577.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 11:04 compact_monitor_2_1777363473776.mp4\n-rw-r--r-- 1 lukas staff 267099 28 Apr 11:09 compact_monitor_2_1777363782342.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 11:14 compact_monitor_2_1777364092822.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 11:20 compact_monitor_2_1777364400840.mp4\n-rw-r--r-- 1 lukas staff 266694 28 Apr 11:25 compact_monitor_2_1777364709144.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 11:30 compact_monitor_2_1777365022090.mp4\n-rw-r--r-- 1 lukas staff 264669 28 Apr 11:35 compact_monitor_2_1777365335928.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 11:40 compact_monitor_2_1777365649137.mp4\n-rw-r--r-- 1 lukas staff 266964 28 Apr 11:46 compact_monitor_2_1777365962619.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 11:51 compact_monitor_2_1777366273740.mp4\n-rw-r--r-- 1 lukas staff 265209 28 Apr 11:56 compact_monitor_2_1777366582034.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 12:01 compact_monitor_2_1777366886631.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 12:06 compact_monitor_2_1777367202805.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 12:11 compact_monitor_2_1777367518861.mp4\n-rw-r--r-- 1 lukas staff 269261 28 Apr 12:17 compact_monitor_2_1777367837441.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 12:22 compact_monitor_2_1777368160952.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 12:28 compact_monitor_2_1777368477571.mp4\n-rw-r--r-- 1 lukas staff 267234 28 Apr 12:33 compact_monitor_2_1777368792600.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 12:38 compact_monitor_2_1777369107069.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 12:43 compact_monitor_2_1777369421530.mp4\n-rw-r--r-- 1 lukas staff 266829 28 Apr 12:48 compact_monitor_2_1777369731189.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 12:54 compact_monitor_2_1777370048214.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 12:59 compact_monitor_2_1777370363567.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 13:04 compact_monitor_2_1777370679314.mp4\n-rw-r--r-- 1 lukas staff 268855 28 Apr 13:09 compact_monitor_2_1777370994284.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 13:15 compact_monitor_2_1777371309064.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 13:20 compact_monitor_2_1777371623643.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 13:25 compact_monitor_2_1777371938006.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 13:30 compact_monitor_2_1777372252120.mp4\n-rw-r--r-- 1 lukas staff 266964 28 Apr 13:36 compact_monitor_2_1777372566394.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 13:41 compact_monitor_2_1777372880197.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 13:46 compact_monitor_2_1777373193667.mp4\n-rw-r--r-- 1 lukas staff 265209 28 Apr 13:51 compact_monitor_2_1777373506832.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 13:56 compact_monitor_2_1777373816197.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 14:02 compact_monitor_2_1777374130774.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 14:07 compact_monitor_2_1777374443527.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 14:12 compact_monitor_2_1777374756405.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 14:17 compact_monitor_2_1777375070551.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 14:23 compact_monitor_2_1777375397987.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 14:28 compact_monitor_2_1777375715930.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 14:33 compact_monitor_2_1777376034152.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 14:39 compact_monitor_2_1777376348246.mp4\n-rw-r--r-- 1 lukas staff 266019 28 Apr 14:44 compact_monitor_2_1777376657026.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 14:49 compact_monitor_2_1777376966683.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 14:54 compact_monitor_2_1777377280571.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:00 compact_monitor_2_1777377602616.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:05 compact_monitor_2_1777377915467.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 15:10 compact_monitor_2_1777378232424.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 15:15 compact_monitor_2_1777378547117.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:21 compact_monitor_2_1777378865359.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 15:26 compact_monitor_2_1777379183376.mp4\n-rw-r--r-- 1 lukas staff 267774 28 Apr 15:31 compact_monitor_2_1777379502714.mp4\n-rw-r--r-- 1 lukas staff 268046 28 Apr 15:37 compact_monitor_2_1777379819259.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 15:42 compact_monitor_2_1777380134674.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 15:47 compact_monitor_2_1777380454708.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 15:52 compact_monitor_2_1777380771150.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 15:58 compact_monitor_2_1777381086934.mp4\n-rw-r--r-- 1 lukas staff 268044 28 Apr 16:03 compact_monitor_2_1777381401816.mp4\n-rw-r--r-- 1 lukas staff 269530 28 Apr 16:08 compact_monitor_2_1777381720100.mp4\n-rw-r--r-- 1 lukas staff 268721 28 Apr 16:13 compact_monitor_2_1777382037168.mp4\n-rw-r--r-- 1 lukas staff 268583 28 Apr 16:19 compact_monitor_2_1777382355014.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 16:24 compact_monitor_2_1777382670965.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 16:29 compact_monitor_2_1777382984987.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 16:34 compact_monitor_2_1777383298084.mp4\n-rw-r--r-- 1 lukas staff 236209 28 Apr 16:40 compact_monitor_2_1777383610070.mp4\n-rw-r--r-- 1 lukas staff 1191690 28 Apr 17:01 compact_monitor_2_1777384877981.mp4\n-rw-r--r-- 1 lukas staff 2975861 28 Apr 17:06 compact_monitor_2_1777385201736.mp4\n-rw-r--r-- 1 lukas staff 5319560 28 Apr 17:12 compact_monitor_2_1777385529432.mp4\n-rw-r--r-- 1 lukas staff 3006284 28 Apr 17:18 compact_monitor_2_1777385870812.mp4\n-rw-r--r-- 1 lukas staff 2726877 28 Apr 17:23 compact_monitor_2_1777386204715.mp4\n-rw-r--r-- 1 lukas staff 3315722 28 Apr 17:29 compact_monitor_2_1777386541280.mp4\n-rw-r--r-- 1 lukas staff 1577465 28 Apr 17:34 compact_monitor_2_1777386883461.mp4\n-rw-r--r-- 1 lukas staff 1745214 28 Apr 17:40 compact_monitor_2_1777387214543.mp4\n-rw-r--r-- 1 lukas staff 950993 28 Apr 17:45 compact_monitor_2_1777387552842.mp4\n-rw-r--r-- 1 lukas staff 429007 28 Apr 17:51 compact_monitor_2_1777387889075.mp4\n-rw-r--r-- 1 lukas staff 884099 28 Apr 17:57 compact_monitor_2_1777388218623.mp4\n-rw-r--r-- 1 lukas staff 2352504 28 Apr 18:02 compact_monitor_2_1777388548021.mp4\n-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4\n-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4\n-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4\n-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4\n-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4\n-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4\n-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4\n-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4\n-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4\n-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4\n-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4\n-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4\n-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4\n-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4\n-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22523176\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 28 Apr 16:51 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite\n-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27 \n[2026-05-06 18:58:18] ========================================\n[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 18:58:18] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m04s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m06s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m07s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)\n frames (7543 rows) ⠴ % \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27\n[2026-05-06 19:22:16] ========================================\n[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 19:22:16] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m01s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m03s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ✓ 4m40s\n ocr_text (2193 rows) ✓ 0m25s\n ui_events (9909 rows) ✓ 0m02s\n elements (470235 rows) ✓ 2m46s\n meetings (3 rows) ✓ 0m00s\n\n[+08m07s] ▶ Updating FTS indexes\n elements_fts ✓ 2m59s\n frames_fts ✓ 6m07s\n ui_events_fts ✓ 0m03s\n\n[+17m16s] ▶ Verifying DB\n frames: 7543 / 7543 ✓\n elements: 470235 / 470235 ✓\n ui_events: 9909 / 9909 ✓\n ocr_text: 2193 / 2193 ✓\n meetings: 3 / 3 ✓\n\n[+18m46s] ▶ Copying data folder for 2026-04-27\n rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)\n\n[2026-05-06 19:41:28] Archive DB size: 9.7G\n[2026-05-06 19:41:28] Total time: 19m12s\n[2026-05-06 19:41:28] Sync complete for 2026-04-27\n[2026-05-06 19:41:28] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28\n[2026-05-06 19:44:49] ========================================\n[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28\n[2026-05-06 19:44:49] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (9.7G)\n Data dir: OK (223 files, 159M)\n\n[+00m00s] ▶ Counting source rows for 2026-04-28\n frames: 4535\n elements: 407532\n ui_events: 8621\n ocr_text: 1623\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m00s\n creating FTS tables ✓ 0m00s\n\n[+00m02s] ▶ Syncing data for 2026-04-28\n video_chunks ✓ 0m12s\n frames (4535 rows) ✓ 1m30s\n ocr_text (1623 rows) ✓ 0m32s\n ui_events (8621 rows) ✓ 0m01s\n elements (407532 rows) ✓ 1m02s\n meetings (3 rows) ✓ 0m00s\n\n[+03m19s] ▶ Updating FTS indexes\n elements_fts ✓ 1m36s\n frames_fts ✓ 2m28s\n ui_events_fts ✓ 0m04s\n\n[+07m27s] ▶ Verifying DB\n frames: 4535 / 4535 ✓\n elements: 407532 / 407532 ✓\n ui_events: 8621 / 8621 ✓\n ocr_text: 1623 / 1623 ✓\n meetings: 3 / 3 ✓\n\n[+08m59s] ▶ Copying data folder for 2026-04-28\n rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)\n\n[2026-05-06 19:54:08] Archive DB size: 10G\n[2026-05-06 19:54:08] Total time: 9m19s\n[2026-05-06 19:54:08] Sync complete for 2026-04-28\n[2026-05-06 19:54:08] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll\ntotal 24\ndrwx------ 9 lukas staff 288 28 Apr 09:18 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\ndrwx------ 5 lukas staff 160 1 Nov 2021 _cacache\ndrwx------@ 2 lukas staff 64 28 Apr 09:18 _locks\ndrwx------ 15 lukas staff 480 27 Apr 19:54 _logs\ndrwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx\n-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked\n-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json\n-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll \ntotal 52920\ndrwx------+ 92 lukas staff 2944 6 May 20:22 .\ndrwxr-xr-x 5 root admin 160 23 Aug 2024 ..\n-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding\n-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store\ndrwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash\ndrwx------ 5 lukas staff 160 1 Nov 2021 .aws\n-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json\n-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history\n-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc\ndrwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito\ndrwx------@ 6 lukas staff 192 9 Apr 19:53 .cache\ndrwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude\n-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json\ndrwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium\ndrwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer\ndrwx------ 16 lukas staff 512 21 May 2025 .config\ndrwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue\ndrwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot\ndrwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor\ndrwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor\ndrwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona\ndrwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb\ndrwx------ 24 lukas staff 768 27 Apr 18:14 .docker\ndrwx------ 15 lukas staff 480 6 Jun 2023 .dropbox\ndrwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak\n-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth\n-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig\n-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp\ndrwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon\ndrwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc\n-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst\ndrwx------ 5 lukas staff 160 23 Dec 2024 .local\n-rw------- 1 lukas staff 204 16 Mar 2024 .netrc\ndrwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp\n-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history\n-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer\ndrwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py\ndrwx------ 8 lukas staff 256 6 May 20:24 .npm\n-rw------- 1 lukas staff 74 20 May 2024 .npmrc\ndrwx------ 32 lukas staff 1024 25 Jul 2025 .nvm\ndrwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile\n-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history\ndrwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode\ndrwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight\ndrwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint\ndrwx------ 15 lukas staff 480 8 Aug 2025 .ssh\ndrwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit\ndrwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm\n-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\n UW PICO 5.09 New Buffer \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n [ Read 1 line ] \n^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos \n^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell \ndrwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm\ndrwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf\ndrwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn\n-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc\n-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile\n-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy\n-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave\n-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save\n-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees\n-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc\ndrwx------@ 9 lukas staff 288 20 Apr 20:55 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV\ndrwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads\ndrwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen\ndrwx------@ 112 lukas staff 3584 2 Dec 09:19 Library\ndrwx------ 7 lukas staff 224 12 Feb 2024 Movies\ndrwx------+ 5 lukas staff 160 25 Sep 2023 Music\ndrwx------+ 9 lukas staff 288 25 Sep 2023 Pictures\ndrwx------ 3 lukas staff 96 8 Nov 2021 Postman\ndrwx------+ 4 lukas staff 128 28 Oct 2021 Public\n-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf\ndrwx------ 4 lukas staff 128 2 Jul 2023 Users\n-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log\n-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 2025 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast\n-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin\n-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh\n-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe\ncd: no such file or directory: /Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated\nchecking permissions...\n screen recording: ok\n microphone: ok\n accessibility: ok\n2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap\n2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update\n2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits\n2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown\n2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export\n2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary\n2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ false │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n│ retention mode │ media-only (keep transcripts) │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ MacBook Pro Microphone (input) │\n│ │ System Audio (output) │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-05-06T20:27:34.638384Z INFO screenpipe: starting UI event capture\n2026-05-06T20:27:34.637679Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-05-06T20:27:34.649154Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(94))\n2026-05-06T20:27:34.652794Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-05-06T20:27:34.655839Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-05-06T20:27:34.673877Z INFO screenpipe_engine::ui_recorder: UI recording session started: 54869993-7b4b-491f-b717-2a583517f9c5\n2026-05-06T20:27:34.673910Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-05-06T20:27:34.674057Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-05-05 17:27:34.674056 UTC to 2026-05-06 17:27:34.674056 UTC)\n2026-05-06T20:27:34.674892Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-05-06T20:27:34.675788Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 0 frame entries, coverage from 2026-05-05 17:27:34.674056 UTC\n2026-05-06T20:27:34.686546Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-05-06T20:27:34.691371Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-05-06T20:27:36.270608Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-05-06T20:27:36.270669Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.270714Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.932583Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-05-06T20:27:36.932852Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-05-06T20:27:36.932882Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-05-06T20:27:36.932899Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-05-06T20:27:36.932901Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-05-06T20:27:39.158281Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 3 excluded)\n2026-05-06T20:27:39.593177Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1, dur=101ms\n2026-05-06T20:27:40.672366Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)","depth":4,"on_screen":true,"value":"-rw-r--r-- 1 lukas staff 658369 28 Apr 10:48 compact_monitor_1_1777362531562.mp4\n-rw-r--r-- 1 lukas staff 658744 28 Apr 10:54 compact_monitor_1_1777362844570.mp4\n-rw-r--r-- 1 lukas staff 658494 28 Apr 10:59 compact_monitor_1_1777363156173.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 11:04 compact_monitor_1_1777363471960.mp4\n-rw-r--r-- 1 lukas staff 659244 28 Apr 11:09 compact_monitor_1_1777363780754.mp4\n-rw-r--r-- 1 lukas staff 658119 28 Apr 11:14 compact_monitor_1_1777364091631.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 11:20 compact_monitor_1_1777364399949.mp4\n-rw-r--r-- 1 lukas staff 658994 28 Apr 11:25 compact_monitor_1_1777364707696.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 11:30 compact_monitor_1_1777365021138.mp4\n-rw-r--r-- 1 lukas staff 657494 28 Apr 11:35 compact_monitor_1_1777365334863.mp4\n-rw-r--r-- 1 lukas staff 658744 28 Apr 11:40 compact_monitor_1_1777365647363.mp4\n-rw-r--r-- 1 lukas staff 659619 28 Apr 11:46 compact_monitor_1_1777365960793.mp4\n-rw-r--r-- 1 lukas staff 658369 28 Apr 11:51 compact_monitor_1_1777366272670.mp4\n-rw-r--r-- 1 lukas staff 657869 28 Apr 11:56 compact_monitor_1_1777366581087.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 12:01 compact_monitor_1_1777366885670.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 12:06 compact_monitor_1_1777367201821.mp4\n-rw-r--r-- 1 lukas staff 657994 28 Apr 12:11 compact_monitor_1_1777367517013.mp4\n-rw-r--r-- 1 lukas staff 661994 28 Apr 12:17 compact_monitor_1_1777367833288.mp4\n-rw-r--r-- 1 lukas staff 658869 28 Apr 12:22 compact_monitor_1_1777368158856.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 12:27 compact_monitor_1_1777368475271.mp4\n-rw-r--r-- 1 lukas staff 659994 28 Apr 12:33 compact_monitor_1_1777368789494.mp4\n-rw-r--r-- 1 lukas staff 658744 28 Apr 12:38 compact_monitor_1_1777369105746.mp4\n-rw-r--r-- 1 lukas staff 658244 28 Apr 12:43 compact_monitor_1_1777369420420.mp4\n-rw-r--r-- 1 lukas staff 659244 28 Apr 12:48 compact_monitor_1_1777369728628.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 12:54 compact_monitor_1_1777370046041.mp4\n-rw-r--r-- 1 lukas staff 657869 28 Apr 12:59 compact_monitor_1_1777370361638.mp4\n-rw-r--r-- 1 lukas staff 658994 28 Apr 13:04 compact_monitor_1_1777370677661.mp4\n-rw-r--r-- 1 lukas staff 660995 28 Apr 13:09 compact_monitor_1_1777370991662.mp4\n-rw-r--r-- 1 lukas staff 658619 28 Apr 13:15 compact_monitor_1_1777371307758.mp4\n-rw-r--r-- 1 lukas staff 659119 28 Apr 13:20 compact_monitor_1_1777371622003.mp4\n-rw-r--r-- 1 lukas staff 659119 28 Apr 13:25 compact_monitor_1_1777371936310.mp4\n-rw-r--r-- 1 lukas staff 658119 28 Apr 13:30 compact_monitor_1_1777372250913.mp4\n-rw-r--r-- 1 lukas staff 659869 28 Apr 13:36 compact_monitor_1_1777372563723.mp4\n-rw-r--r-- 1 lukas staff 658619 28 Apr 13:41 compact_monitor_1_1777372878952.mp4\n-rw-r--r-- 1 lukas staff 658119 28 Apr 13:46 compact_monitor_1_1777373192385.mp4\n-rw-r--r-- 1 lukas staff 658119 28 Apr 13:51 compact_monitor_1_1777373505576.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 13:56 compact_monitor_1_1777373815249.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 14:02 compact_monitor_1_1777374129679.mp4\n-rw-r--r-- 1 lukas staff 657869 28 Apr 14:07 compact_monitor_1_1777374442607.mp4\n-rw-r--r-- 1 lukas staff 658619 28 Apr 14:12 compact_monitor_1_1777374754971.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 14:17 compact_monitor_1_1777375068922.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 14:23 compact_monitor_1_1777375395803.mp4\n-rw-r--r-- 1 lukas staff 659619 28 Apr 14:28 compact_monitor_1_1777375713843.mp4\n-rw-r--r-- 1 lukas staff 658869 28 Apr 14:33 compact_monitor_1_1777376032046.mp4\n-rw-r--r-- 1 lukas staff 659494 28 Apr 14:39 compact_monitor_1_1777376346251.mp4\n-rw-r--r-- 1 lukas staff 658744 28 Apr 14:44 compact_monitor_1_1777376655731.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 14:49 compact_monitor_1_1777376965747.mp4\n-rw-r--r-- 1 lukas staff 658869 28 Apr 14:54 compact_monitor_1_1777377278905.mp4\n-rw-r--r-- 1 lukas staff 658869 28 Apr 15:00 compact_monitor_1_1777377599386.mp4\n-rw-r--r-- 1 lukas staff 659494 28 Apr 15:05 compact_monitor_1_1777377913234.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 15:10 compact_monitor_1_1777378230148.mp4\n-rw-r--r-- 1 lukas staff 657744 28 Apr 15:15 compact_monitor_1_1777378546013.mp4\n-rw-r--r-- 1 lukas staff 658994 28 Apr 15:21 compact_monitor_1_1777378863028.mp4\n-rw-r--r-- 1 lukas staff 657619 28 Apr 15:26 compact_monitor_1_1777379181829.mp4\n-rw-r--r-- 1 lukas staff 660244 28 Apr 15:31 compact_monitor_1_1777379498541.mp4\n-rw-r--r-- 1 lukas staff 661370 28 Apr 15:36 compact_monitor_1_1777379816522.mp4\n-rw-r--r-- 1 lukas staff 657994 28 Apr 15:42 compact_monitor_1_1777380132952.mp4\n-rw-r--r-- 1 lukas staff 658494 28 Apr 15:47 compact_monitor_1_1777380451138.mp4\n-rw-r--r-- 1 lukas staff 658119 28 Apr 15:52 compact_monitor_1_1777380769459.mp4\n-rw-r--r-- 1 lukas staff 658869 28 Apr 15:58 compact_monitor_1_1777381085241.mp4\n-rw-r--r-- 1 lukas staff 660245 28 Apr 16:03 compact_monitor_1_1777381399658.mp4\n-rw-r--r-- 1 lukas staff 661870 28 Apr 16:08 compact_monitor_1_1777381716781.mp4\n-rw-r--r-- 1 lukas staff 661620 28 Apr 16:13 compact_monitor_1_1777382034411.mp4\n-rw-r--r-- 1 lukas staff 661118 28 Apr 16:19 compact_monitor_1_1777382351932.mp4\n-rw-r--r-- 1 lukas staff 659369 28 Apr 16:24 compact_monitor_1_1777382669035.mp4\n-rw-r--r-- 1 lukas staff 659119 28 Apr 16:29 compact_monitor_1_1777382983556.mp4\n-rw-r--r-- 1 lukas staff 657869 28 Apr 16:34 compact_monitor_1_1777383297132.mp4\n-rw-r--r-- 1 lukas staff 606367 28 Apr 16:40 compact_monitor_1_1777383609588.mp4\n-rw-r--r-- 1 lukas staff 397068 28 Apr 17:01 compact_monitor_1_1777384874970.mp4\n-rw-r--r-- 1 lukas staff 1592462 28 Apr 17:06 compact_monitor_1_1777385198571.mp4\n-rw-r--r-- 1 lukas staff 1327809 28 Apr 17:12 compact_monitor_1_1777385523980.mp4\n-rw-r--r-- 1 lukas staff 2262498 28 Apr 17:17 compact_monitor_1_1777385864559.mp4\n-rw-r--r-- 1 lukas staff 1702453 28 Apr 17:23 compact_monitor_1_1777386198870.mp4\n-rw-r--r-- 1 lukas staff 2034287 28 Apr 17:29 compact_monitor_1_1777386532344.mp4\n-rw-r--r-- 1 lukas staff 1352893 28 Apr 17:34 compact_monitor_1_1777386875277.mp4\n-rw-r--r-- 1 lukas staff 1873946 28 Apr 17:40 compact_monitor_1_1777387208685.mp4\n-rw-r--r-- 1 lukas staff 1155463 28 Apr 17:45 compact_monitor_1_1777387548798.mp4\n-rw-r--r-- 1 lukas staff 1428159 28 Apr 17:51 compact_monitor_1_1777387882691.mp4\n-rw-r--r-- 1 lukas staff 1398484 28 Apr 17:56 compact_monitor_1_1777388213861.mp4\n-rw-r--r-- 1 lukas staff 1688438 28 Apr 18:02 compact_monitor_1_1777388542869.mp4\n-rw-r--r-- 1 lukas staff 2401161 28 Apr 18:07 compact_monitor_1_1777388869470.mp4\n-rw-r--r-- 1 lukas staff 1283247 28 Apr 18:13 compact_monitor_1_1777389192202.mp4\n-rw-r--r-- 1 lukas staff 1398160 28 Apr 18:18 compact_monitor_1_1777389525394.mp4\n-rw-r--r-- 1 lukas staff 452906 28 Apr 18:24 compact_monitor_1_1777389856559.mp4\n-rw-r--r-- 1 lukas staff 566518 28 Apr 18:29 compact_monitor_1_1777390191054.mp4\n-rw-r--r-- 1 lukas staff 445894 28 Apr 18:35 compact_monitor_1_1777390513567.mp4\n-rw-r--r-- 1 lukas staff 444044 28 Apr 18:40 compact_monitor_1_1777390841877.mp4\n-rw-r--r-- 1 lukas staff 437853 28 Apr 18:46 compact_monitor_1_1777391162552.mp4\n-rw-r--r-- 1 lukas staff 441008 28 Apr 18:51 compact_monitor_1_1777391489107.mp4\n-rw-r--r-- 1 lukas staff 443934 28 Apr 18:57 compact_monitor_1_1777391823165.mp4\n-rw-r--r-- 1 lukas staff 443624 28 Apr 19:02 compact_monitor_1_1777392146221.mp4\n-rw-r--r-- 1 lukas staff 447164 28 Apr 19:07 compact_monitor_1_1777392469679.mp4\n-rw-r--r-- 1 lukas staff 442431 28 Apr 19:13 compact_monitor_1_1777392792794.mp4\n-rw-r--r-- 1 lukas staff 436805 28 Apr 19:18 compact_monitor_1_1777393109301.mp4\n-rw-r--r-- 1 lukas staff 435633 28 Apr 19:23 compact_monitor_1_1777393423192.mp4\n-rw-r--r-- 1 lukas staff 1162510 28 Apr 09:30 compact_monitor_2_1777357806702.mp4\n-rw-r--r-- 1 lukas staff 3394878 28 Apr 09:35 compact_monitor_2_1777358126186.mp4\n-rw-r--r-- 1 lukas staff 268044 28 Apr 09:40 compact_monitor_2_1777358443280.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 09:46 compact_monitor_2_1777358769231.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 09:51 compact_monitor_2_1777359084493.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 09:56 compact_monitor_2_1777359399758.mp4\n-rw-r--r-- 1 lukas staff 266694 28 Apr 10:01 compact_monitor_2_1777359707884.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 10:06 compact_monitor_2_1777360016892.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 10:12 compact_monitor_2_1777360329199.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 10:17 compact_monitor_2_1777360641498.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 10:22 compact_monitor_2_1777360953971.mp4\n-rw-r--r-- 1 lukas staff 267099 28 Apr 10:27 compact_monitor_2_1777361264266.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 10:33 compact_monitor_2_1777361583211.mp4\n-rw-r--r-- 1 lukas staff 266829 28 Apr 10:38 compact_monitor_2_1777361903545.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 10:43 compact_monitor_2_1777362219032.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 10:48 compact_monitor_2_1777362532674.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 10:54 compact_monitor_2_1777362845950.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 10:59 compact_monitor_2_1777363157577.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 11:04 compact_monitor_2_1777363473776.mp4\n-rw-r--r-- 1 lukas staff 267099 28 Apr 11:09 compact_monitor_2_1777363782342.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 11:14 compact_monitor_2_1777364092822.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 11:20 compact_monitor_2_1777364400840.mp4\n-rw-r--r-- 1 lukas staff 266694 28 Apr 11:25 compact_monitor_2_1777364709144.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 11:30 compact_monitor_2_1777365022090.mp4\n-rw-r--r-- 1 lukas staff 264669 28 Apr 11:35 compact_monitor_2_1777365335928.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 11:40 compact_monitor_2_1777365649137.mp4\n-rw-r--r-- 1 lukas staff 266964 28 Apr 11:46 compact_monitor_2_1777365962619.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 11:51 compact_monitor_2_1777366273740.mp4\n-rw-r--r-- 1 lukas staff 265209 28 Apr 11:56 compact_monitor_2_1777366582034.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 12:01 compact_monitor_2_1777366886631.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 12:06 compact_monitor_2_1777367202805.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 12:11 compact_monitor_2_1777367518861.mp4\n-rw-r--r-- 1 lukas staff 269261 28 Apr 12:17 compact_monitor_2_1777367837441.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 12:22 compact_monitor_2_1777368160952.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 12:28 compact_monitor_2_1777368477571.mp4\n-rw-r--r-- 1 lukas staff 267234 28 Apr 12:33 compact_monitor_2_1777368792600.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 12:38 compact_monitor_2_1777369107069.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 12:43 compact_monitor_2_1777369421530.mp4\n-rw-r--r-- 1 lukas staff 266829 28 Apr 12:48 compact_monitor_2_1777369731189.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 12:54 compact_monitor_2_1777370048214.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 12:59 compact_monitor_2_1777370363567.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 13:04 compact_monitor_2_1777370679314.mp4\n-rw-r--r-- 1 lukas staff 268855 28 Apr 13:09 compact_monitor_2_1777370994284.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 13:15 compact_monitor_2_1777371309064.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 13:20 compact_monitor_2_1777371623643.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 13:25 compact_monitor_2_1777371938006.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 13:30 compact_monitor_2_1777372252120.mp4\n-rw-r--r-- 1 lukas staff 266964 28 Apr 13:36 compact_monitor_2_1777372566394.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 13:41 compact_monitor_2_1777372880197.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 13:46 compact_monitor_2_1777373193667.mp4\n-rw-r--r-- 1 lukas staff 265209 28 Apr 13:51 compact_monitor_2_1777373506832.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 13:56 compact_monitor_2_1777373816197.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 14:02 compact_monitor_2_1777374130774.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 14:07 compact_monitor_2_1777374443527.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 14:12 compact_monitor_2_1777374756405.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 14:17 compact_monitor_2_1777375070551.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 14:23 compact_monitor_2_1777375397987.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 14:28 compact_monitor_2_1777375715930.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 14:33 compact_monitor_2_1777376034152.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 14:39 compact_monitor_2_1777376348246.mp4\n-rw-r--r-- 1 lukas staff 266019 28 Apr 14:44 compact_monitor_2_1777376657026.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 14:49 compact_monitor_2_1777376966683.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 14:54 compact_monitor_2_1777377280571.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:00 compact_monitor_2_1777377602616.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:05 compact_monitor_2_1777377915467.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 15:10 compact_monitor_2_1777378232424.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 15:15 compact_monitor_2_1777378547117.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:21 compact_monitor_2_1777378865359.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 15:26 compact_monitor_2_1777379183376.mp4\n-rw-r--r-- 1 lukas staff 267774 28 Apr 15:31 compact_monitor_2_1777379502714.mp4\n-rw-r--r-- 1 lukas staff 268046 28 Apr 15:37 compact_monitor_2_1777379819259.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 15:42 compact_monitor_2_1777380134674.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 15:47 compact_monitor_2_1777380454708.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 15:52 compact_monitor_2_1777380771150.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 15:58 compact_monitor_2_1777381086934.mp4\n-rw-r--r-- 1 lukas staff 268044 28 Apr 16:03 compact_monitor_2_1777381401816.mp4\n-rw-r--r-- 1 lukas staff 269530 28 Apr 16:08 compact_monitor_2_1777381720100.mp4\n-rw-r--r-- 1 lukas staff 268721 28 Apr 16:13 compact_monitor_2_1777382037168.mp4\n-rw-r--r-- 1 lukas staff 268583 28 Apr 16:19 compact_monitor_2_1777382355014.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 16:24 compact_monitor_2_1777382670965.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 16:29 compact_monitor_2_1777382984987.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 16:34 compact_monitor_2_1777383298084.mp4\n-rw-r--r-- 1 lukas staff 236209 28 Apr 16:40 compact_monitor_2_1777383610070.mp4\n-rw-r--r-- 1 lukas staff 1191690 28 Apr 17:01 compact_monitor_2_1777384877981.mp4\n-rw-r--r-- 1 lukas staff 2975861 28 Apr 17:06 compact_monitor_2_1777385201736.mp4\n-rw-r--r-- 1 lukas staff 5319560 28 Apr 17:12 compact_monitor_2_1777385529432.mp4\n-rw-r--r-- 1 lukas staff 3006284 28 Apr 17:18 compact_monitor_2_1777385870812.mp4\n-rw-r--r-- 1 lukas staff 2726877 28 Apr 17:23 compact_monitor_2_1777386204715.mp4\n-rw-r--r-- 1 lukas staff 3315722 28 Apr 17:29 compact_monitor_2_1777386541280.mp4\n-rw-r--r-- 1 lukas staff 1577465 28 Apr 17:34 compact_monitor_2_1777386883461.mp4\n-rw-r--r-- 1 lukas staff 1745214 28 Apr 17:40 compact_monitor_2_1777387214543.mp4\n-rw-r--r-- 1 lukas staff 950993 28 Apr 17:45 compact_monitor_2_1777387552842.mp4\n-rw-r--r-- 1 lukas staff 429007 28 Apr 17:51 compact_monitor_2_1777387889075.mp4\n-rw-r--r-- 1 lukas staff 884099 28 Apr 17:57 compact_monitor_2_1777388218623.mp4\n-rw-r--r-- 1 lukas staff 2352504 28 Apr 18:02 compact_monitor_2_1777388548021.mp4\n-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4\n-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4\n-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4\n-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4\n-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4\n-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4\n-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4\n-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4\n-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4\n-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4\n-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4\n-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4\n-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4\n-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4\n-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22523176\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 28 Apr 16:51 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite\n-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27 \n[2026-05-06 18:58:18] ========================================\n[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 18:58:18] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m04s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m06s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m07s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)\n frames (7543 rows) ⠴ % \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27\n[2026-05-06 19:22:16] ========================================\n[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 19:22:16] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m01s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m03s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ✓ 4m40s\n ocr_text (2193 rows) ✓ 0m25s\n ui_events (9909 rows) ✓ 0m02s\n elements (470235 rows) ✓ 2m46s\n meetings (3 rows) ✓ 0m00s\n\n[+08m07s] ▶ Updating FTS indexes\n elements_fts ✓ 2m59s\n frames_fts ✓ 6m07s\n ui_events_fts ✓ 0m03s\n\n[+17m16s] ▶ Verifying DB\n frames: 7543 / 7543 ✓\n elements: 470235 / 470235 ✓\n ui_events: 9909 / 9909 ✓\n ocr_text: 2193 / 2193 ✓\n meetings: 3 / 3 ✓\n\n[+18m46s] ▶ Copying data folder for 2026-04-27\n rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)\n\n[2026-05-06 19:41:28] Archive DB size: 9.7G\n[2026-05-06 19:41:28] Total time: 19m12s\n[2026-05-06 19:41:28] Sync complete for 2026-04-27\n[2026-05-06 19:41:28] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28\n[2026-05-06 19:44:49] ========================================\n[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28\n[2026-05-06 19:44:49] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (9.7G)\n Data dir: OK (223 files, 159M)\n\n[+00m00s] ▶ Counting source rows for 2026-04-28\n frames: 4535\n elements: 407532\n ui_events: 8621\n ocr_text: 1623\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m00s\n creating FTS tables ✓ 0m00s\n\n[+00m02s] ▶ Syncing data for 2026-04-28\n video_chunks ✓ 0m12s\n frames (4535 rows) ✓ 1m30s\n ocr_text (1623 rows) ✓ 0m32s\n ui_events (8621 rows) ✓ 0m01s\n elements (407532 rows) ✓ 1m02s\n meetings (3 rows) ✓ 0m00s\n\n[+03m19s] ▶ Updating FTS indexes\n elements_fts ✓ 1m36s\n frames_fts ✓ 2m28s\n ui_events_fts ✓ 0m04s\n\n[+07m27s] ▶ Verifying DB\n frames: 4535 / 4535 ✓\n elements: 407532 / 407532 ✓\n ui_events: 8621 / 8621 ✓\n ocr_text: 1623 / 1623 ✓\n meetings: 3 / 3 ✓\n\n[+08m59s] ▶ Copying data folder for 2026-04-28\n rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)\n\n[2026-05-06 19:54:08] Archive DB size: 10G\n[2026-05-06 19:54:08] Total time: 9m19s\n[2026-05-06 19:54:08] Sync complete for 2026-04-28\n[2026-05-06 19:54:08] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll\ntotal 24\ndrwx------ 9 lukas staff 288 28 Apr 09:18 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\ndrwx------ 5 lukas staff 160 1 Nov 2021 _cacache\ndrwx------@ 2 lukas staff 64 28 Apr 09:18 _locks\ndrwx------ 15 lukas staff 480 27 Apr 19:54 _logs\ndrwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx\n-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked\n-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json\n-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll \ntotal 52920\ndrwx------+ 92 lukas staff 2944 6 May 20:22 .\ndrwxr-xr-x 5 root admin 160 23 Aug 2024 ..\n-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding\n-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store\ndrwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash\ndrwx------ 5 lukas staff 160 1 Nov 2021 .aws\n-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json\n-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history\n-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc\ndrwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito\ndrwx------@ 6 lukas staff 192 9 Apr 19:53 .cache\ndrwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude\n-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json\ndrwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium\ndrwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer\ndrwx------ 16 lukas staff 512 21 May 2025 .config\ndrwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue\ndrwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot\ndrwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor\ndrwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor\ndrwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona\ndrwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb\ndrwx------ 24 lukas staff 768 27 Apr 18:14 .docker\ndrwx------ 15 lukas staff 480 6 Jun 2023 .dropbox\ndrwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak\n-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth\n-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig\n-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp\ndrwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon\ndrwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc\n-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst\ndrwx------ 5 lukas staff 160 23 Dec 2024 .local\n-rw------- 1 lukas staff 204 16 Mar 2024 .netrc\ndrwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp\n-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history\n-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer\ndrwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py\ndrwx------ 8 lukas staff 256 6 May 20:24 .npm\n-rw------- 1 lukas staff 74 20 May 2024 .npmrc\ndrwx------ 32 lukas staff 1024 25 Jul 2025 .nvm\ndrwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile\n-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history\ndrwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode\ndrwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight\ndrwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint\ndrwx------ 15 lukas staff 480 8 Aug 2025 .ssh\ndrwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit\ndrwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm\n-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\n UW PICO 5.09 New Buffer \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n [ Read 1 line ] \n^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos \n^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell \ndrwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm\ndrwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf\ndrwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn\n-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc\n-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile\n-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy\n-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave\n-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save\n-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees\n-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc\ndrwx------@ 9 lukas staff 288 20 Apr 20:55 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV\ndrwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads\ndrwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen\ndrwx------@ 112 lukas staff 3584 2 Dec 09:19 Library\ndrwx------ 7 lukas staff 224 12 Feb 2024 Movies\ndrwx------+ 5 lukas staff 160 25 Sep 2023 Music\ndrwx------+ 9 lukas staff 288 25 Sep 2023 Pictures\ndrwx------ 3 lukas staff 96 8 Nov 2021 Postman\ndrwx------+ 4 lukas staff 128 28 Oct 2021 Public\n-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf\ndrwx------ 4 lukas staff 128 2 Jul 2023 Users\n-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log\n-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 2025 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast\n-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin\n-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh\n-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe\ncd: no such file or directory: /Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated\nchecking permissions...\n screen recording: ok\n microphone: ok\n accessibility: ok\n2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap\n2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update\n2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits\n2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown\n2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export\n2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary\n2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ false │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n│ retention mode │ media-only (keep transcripts) │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ MacBook Pro Microphone (input) │\n│ │ System Audio (output) │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-05-06T20:27:34.638384Z INFO screenpipe: starting UI event capture\n2026-05-06T20:27:34.637679Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-05-06T20:27:34.649154Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(94))\n2026-05-06T20:27:34.652794Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-05-06T20:27:34.655839Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-05-06T20:27:34.673877Z INFO screenpipe_engine::ui_recorder: UI recording session started: 54869993-7b4b-491f-b717-2a583517f9c5\n2026-05-06T20:27:34.673910Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-05-06T20:27:34.674057Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-05-05 17:27:34.674056 UTC to 2026-05-06 17:27:34.674056 UTC)\n2026-05-06T20:27:34.674892Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-05-06T20:27:34.675788Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 0 frame entries, coverage from 2026-05-05 17:27:34.674056 UTC\n2026-05-06T20:27:34.686546Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-05-06T20:27:34.691371Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-05-06T20:27:36.270608Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-05-06T20:27:36.270669Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.270714Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.932583Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-05-06T20:27:36.932852Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-05-06T20:27:36.932882Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-05-06T20:27:36.932899Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-05-06T20:27:36.932901Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-05-06T20:27:39.158281Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 3 excluded)\n2026-05-06T20:27:39.593177Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1, dur=101ms\n2026-05-06T20:27:40.672366Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)","is_focused":true},{"role":"AXTextField","text":"you","depth":3,"bounds":{"left":0.64793885,"top":1.0,"width":0.0625,"height":-0.07581806},"on_screen":true,"automation_id":"_NS:65","value":"you","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.64860374,"top":1.0,"width":0.00831117,"height":-0.07581806},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.7017952,"top":1.0,"width":0.00731383,"height":-0.07581806},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.7130984,"top":1.0,"width":0.006981383,"height":-0.07661617},"on_screen":true,"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.7200798,"top":1.0,"width":0.006981383,"height":-0.07661617},"on_screen":true,"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.3487367,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.35073137,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.42719415,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42918882,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.58410907,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.58610374,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.6625665,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.66456115,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.4956782,"top":1.0,"width":0.027925532,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
514828688542046928
|
598036581918358545
|
manual
|
accessibility
|
NULL
|
-rw-r--r-- 1 lukas staff 658369 28 Apr 10:48 -rw-r--r-- 1 lukas staff 658369 28 Apr 10:48 compact_monitor_1_1777362531562.mp4
-rw-r--r-- 1 lukas staff 658744 28 Apr 10:54 compact_monitor_1_1777362844570.mp4
-rw-r--r-- 1 lukas staff 658494 28 Apr 10:59 compact_monitor_1_1777363156173.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 11:04 compact_monitor_1_1777363471960.mp4
-rw-r--r-- 1 lukas staff 659244 28 Apr 11:09 compact_monitor_1_1777363780754.mp4
-rw-r--r-- 1 lukas staff 658119 28 Apr 11:14 compact_monitor_1_1777364091631.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 11:20 compact_monitor_1_1777364399949.mp4
-rw-r--r-- 1 lukas staff 658994 28 Apr 11:25 compact_monitor_1_1777364707696.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 11:30 compact_monitor_1_1777365021138.mp4
-rw-r--r-- 1 lukas staff 657494 28 Apr 11:35 compact_monitor_1_1777365334863.mp4
-rw-r--r-- 1 lukas staff 658744 28 Apr 11:40 compact_monitor_1_1777365647363.mp4
-rw-r--r-- 1 lukas staff 659619 28 Apr 11:46 compact_monitor_1_1777365960793.mp4
-rw-r--r-- 1 lukas staff 658369 28 Apr 11:51 compact_monitor_1_1777366272670.mp4
-rw-r--r-- 1 lukas staff 657869 28 Apr 11:56 compact_monitor_1_1777366581087.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 12:01 compact_monitor_1_1777366885670.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 12:06 compact_monitor_1_1777367201821.mp4
-rw-r--r-- 1 lukas staff 657994 28 Apr 12:11 compact_monitor_1_1777367517013.mp4
-rw-r--r-- 1 lukas staff 661994 28 Apr 12:17 compact_monitor_1_1777367833288.mp4
-rw-r--r-- 1 lukas staff 658869 28 Apr 12:22 compact_monitor_1_1777368158856.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 12:27 compact_monitor_1_1777368475271.mp4
-rw-r--r-- 1 lukas staff 659994 28 Apr 12:33 compact_monitor_1_1777368789494.mp4
-rw-r--r-- 1 lukas staff 658744 28 Apr 12:38 compact_monitor_1_1777369105746.mp4
-rw-r--r-- 1 lukas staff 658244 28 Apr 12:43 compact_monitor_1_1777369420420.mp4
-rw-r--r-- 1 lukas staff 659244 28 Apr 12:48 compact_monitor_1_1777369728628.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 12:54 compact_monitor_1_1777370046041.mp4
-rw-r--r-- 1 lukas staff 657869 28 Apr 12:59 compact_monitor_1_1777370361638.mp4
-rw-r--r-- 1 lukas staff 658994 28 Apr 13:04 compact_monitor_1_1777370677661.mp4
-rw-r--r-- 1 lukas staff 660995 28 Apr 13:09 compact_monitor_1_1777370991662.mp4
-rw-r--r-- 1 lukas staff 658619 28 Apr 13:15 compact_monitor_1_1777371307758.mp4
-rw-r--r-- 1 lukas staff 659119 28 Apr 13:20 compact_monitor_1_1777371622003.mp4
-rw-r--r-- 1 lukas staff 659119 28 Apr 13:25 compact_monitor_1_1777371936310.mp4
-rw-r--r-- 1 lukas staff 658119 28 Apr 13:30 compact_monitor_1_1777372250913.mp4
-rw-r--r-- 1 lukas staff 659869 28 Apr 13:36 compact_monitor_1_1777372563723.mp4
-rw-r--r-- 1 lukas staff 658619 28 Apr 13:41 compact_monitor_1_1777372878952.mp4
-rw-r--r-- 1 lukas staff 658119 28 Apr 13:46 compact_monitor_1_1777373192385.mp4
-rw-r--r-- 1 lukas staff 658119 28 Apr 13:51 compact_monitor_1_1777373505576.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 13:56 compact_monitor_1_1777373815249.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 14:02 compact_monitor_1_1777374129679.mp4
-rw-r--r-- 1 lukas staff 657869 28 Apr 14:07 compact_monitor_1_1777374442607.mp4
-rw-r--r-- 1 lukas staff 658619 28 Apr 14:12 compact_monitor_1_1777374754971.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 14:17 compact_monitor_1_1777375068922.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 14:23 compact_monitor_1_1777375395803.mp4
-rw-r--r-- 1 lukas staff 659619 28 Apr 14:28 compact_monitor_1_1777375713843.mp4
-rw-r--r-- 1 lukas staff 658869 28 Apr 14:33 compact_monitor_1_1777376032046.mp4
-rw-r--r-- 1 lukas staff 659494 28 Apr 14:39 compact_monitor_1_1777376346251.mp4
-rw-r--r-- 1 lukas staff 658744 28 Apr 14:44 compact_monitor_1_1777376655731.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 14:49 compact_monitor_1_1777376965747.mp4
-rw-r--r-- 1 lukas staff 658869 28 Apr 14:54 compact_monitor_1_1777377278905.mp4
-rw-r--r-- 1 lukas staff 658869 28 Apr 15:00 compact_monitor_1_1777377599386.mp4
-rw-r--r-- 1 lukas staff 659494 28 Apr 15:05 compact_monitor_1_1777377913234.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 15:10 compact_monitor_1_1777378230148.mp4
-rw-r--r-- 1 lukas staff 657744 28 Apr 15:15 compact_monitor_1_1777378546013.mp4
-rw-r--r-- 1 lukas staff 658994 28 Apr 15:21 compact_monitor_1_1777378863028.mp4
-rw-r--r-- 1 lukas staff 657619 28 Apr 15:26 compact_monitor_1_1777379181829.mp4
-rw-r--r-- 1 lukas staff 660244 28 Apr 15:31 compact_monitor_1_1777379498541.mp4
-rw-r--r-- 1 lukas staff 661370 28 Apr 15:36 compact_monitor_1_1777379816522.mp4
-rw-r--r-- 1 lukas staff 657994 28 Apr 15:42 compact_monitor_1_1777380132952.mp4
-rw-r--r-- 1 lukas staff 658494 28 Apr 15:47 compact_monitor_1_1777380451138.mp4
-rw-r--r-- 1 lukas staff 658119 28 Apr 15:52 compact_monitor_1_1777380769459.mp4
-rw-r--r-- 1 lukas staff 658869 28 Apr 15:58 compact_monitor_1_1777381085241.mp4
-rw-r--r-- 1 lukas staff 660245 28 Apr 16:03 compact_monitor_1_1777381399658.mp4
-rw-r--r-- 1 lukas staff 661870 28 Apr 16:08 compact_monitor_1_1777381716781.mp4
-rw-r--r-- 1 lukas staff 661620 28 Apr 16:13 compact_monitor_1_1777382034411.mp4
-rw-r--r-- 1 lukas staff 661118 28 Apr 16:19 compact_monitor_1_1777382351932.mp4
-rw-r--r-- 1 lukas staff 659369 28 Apr 16:24 compact_monitor_1_1777382669035.mp4
-rw-r--r-- 1 lukas staff 659119 28 Apr 16:29 compact_monitor_1_1777382983556.mp4
-rw-r--r-- 1 lukas staff 657869 28 Apr 16:34 compact_monitor_1_1777383297132.mp4
-rw-r--r-- 1 lukas staff 606367 28 Apr 16:40 compact_monitor_1_1777383609588.mp4
-rw-r--r-- 1 lukas staff 397068 28 Apr 17:01 compact_monitor_1_1777384874970.mp4
-rw-r--r-- 1 lukas staff 1592462 28 Apr 17:06 compact_monitor_1_1777385198571.mp4
-rw-r--r-- 1 lukas staff 1327809 28 Apr 17:12 compact_monitor_1_1777385523980.mp4
-rw-r--r-- 1 lukas staff 2262498 28 Apr 17:17 compact_monitor_1_1777385864559.mp4
-rw-r--r-- 1 lukas staff 1702453 28 Apr 17:23 compact_monitor_1_1777386198870.mp4
-rw-r--r-- 1 lukas staff 2034287 28 Apr 17:29 compact_monitor_1_1777386532344.mp4
-rw-r--r-- 1 lukas staff 1352893 28 Apr 17:34 compact_monitor_1_1777386875277.mp4
-rw-r--r-- 1 lukas staff 1873946 28 Apr 17:40 compact_monitor_1_1777387208685.mp4
-rw-r--r-- 1 lukas staff 1155463 28 Apr 17:45 compact_monitor_1_1777387548798.mp4
-rw-r--r-- 1 lukas staff 1428159 28 Apr 17:51 compact_monitor_1_1777387882691.mp4
-rw-r--r-- 1 lukas staff 1398484 28 Apr 17:56 compact_monitor_1_1777388213861.mp4
-rw-r--r-- 1 lukas staff 1688438 28 Apr 18:02 compact_monitor_1_1777388542869.mp4
-rw-r--r-- 1 lukas staff 2401161 28 Apr 18:07 compact_monitor_1_1777388869470.mp4
-rw-r--r-- 1 lukas staff 1283247 28 Apr 18:13 compact_monitor_1_1777389192202.mp4
-rw-r--r-- 1 lukas staff 1398160 28 Apr 18:18 compact_monitor_1_1777389525394.mp4
-rw-r--r-- 1 lukas staff 452906 28 Apr 18:24 compact_monitor_1_1777389856559.mp4
-rw-r--r-- 1 lukas staff 566518 28 Apr 18:29 compact_monitor_1_1777390191054.mp4
-rw-r--r-- 1 lukas staff 445894 28 Apr 18:35 compact_monitor_1_1777390513567.mp4
-rw-r--r-- 1 lukas staff 444044 28 Apr 18:40 compact_monitor_1_1777390841877.mp4
-rw-r--r-- 1 lukas staff 437853 28 Apr 18:46 compact_monitor_1_1777391162552.mp4
-rw-r--r-- 1 lukas staff 441008 28 Apr 18:51 compact_monitor_1_1777391489107.mp4
-rw-r--r-- 1 lukas staff 443934 28 Apr 18:57 compact_monitor_1_1777391823165.mp4
-rw-r--r-- 1 lukas staff 443624 28 Apr 19:02 compact_monitor_1_1777392146221.mp4
-rw-r--r-- 1 lukas staff 447164 28 Apr 19:07 compact_monitor_1_1777392469679.mp4
-rw-r--r-- 1 lukas staff 442431 28 Apr 19:13 compact_monitor_1_1777392792794.mp4
-rw-r--r-- 1 lukas staff 436805 28 Apr 19:18 compact_monitor_1_1777393109301.mp4
-rw-r--r-- 1 lukas staff 435633 28 Apr 19:23 compact_monitor_1_1777393423192.mp4
-rw-r--r-- 1 lukas staff 1162510 28 Apr 09:30 compact_monitor_2_1777357806702.mp4
-rw-r--r-- 1 lukas staff 3394878 28 Apr 09:35 compact_monitor_2_1777358126186.mp4
-rw-r--r-- 1 lukas staff 268044 28 Apr 09:40 compact_monitor_2_1777358443280.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 09:46 compact_monitor_2_1777358769231.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 09:51 compact_monitor_2_1777359084493.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 09:56 compact_monitor_2_1777359399758.mp4
-rw-r--r-- 1 lukas staff 266694 28 Apr 10:01 compact_monitor_2_1777359707884.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 10:06 compact_monitor_2_1777360016892.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 10:12 compact_monitor_2_1777360329199.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 10:17 compact_monitor_2_1777360641498.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 10:22 compact_monitor_2_1777360953971.mp4
-rw-r--r-- 1 lukas staff 267099 28 Apr 10:27 compact_monitor_2_1777361264266.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 10:33 compact_monitor_2_1777361583211.mp4
-rw-r--r-- 1 lukas staff 266829 28 Apr 10:38 compact_monitor_2_1777361903545.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 10:43 compact_monitor_2_1777362219032.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 10:48 compact_monitor_2_1777362532674.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 10:54 compact_monitor_2_1777362845950.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 10:59 compact_monitor_2_1777363157577.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 11:04 compact_monitor_2_1777363473776.mp4
-rw-r--r-- 1 lukas staff 267099 28 Apr 11:09 compact_monitor_2_1777363782342.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 11:14 compact_monitor_2_1777364092822.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 11:20 compact_monitor_2_1777364400840.mp4
-rw-r--r-- 1 lukas staff 266694 28 Apr 11:25 compact_monitor_2_1777364709144.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 11:30 compact_monitor_2_1777365022090.mp4
-rw-r--r-- 1 lukas staff 264669 28 Apr 11:35 compact_monitor_2_1777365335928.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 11:40 compact_monitor_2_1777365649137.mp4
-rw-r--r-- 1 lukas staff 266964 28 Apr 11:46 compact_monitor_2_1777365962619.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 11:51 compact_monitor_2_1777366273740.mp4
-rw-r--r-- 1 lukas staff 265209 28 Apr 11:56 compact_monitor_2_1777366582034.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 12:01 compact_monitor_2_1777366886631.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 12:06 compact_monitor_2_1777367202805.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 12:11 compact_monitor_2_1777367518861.mp4
-rw-r--r-- 1 lukas staff 269261 28 Apr 12:17 compact_monitor_2_1777367837441.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 12:22 compact_monitor_2_1777368160952.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 12:28 compact_monitor_2_1777368477571.mp4
-rw-r--r-- 1 lukas staff 267234 28 Apr 12:33 compact_monitor_2_1777368792600.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 12:38 compact_monitor_2_1777369107069.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 12:43 compact_monitor_2_1777369421530.mp4
-rw-r--r-- 1 lukas staff 266829 28 Apr 12:48 compact_monitor_2_1777369731189.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 12:54 compact_monitor_2_1777370048214.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 12:59 compact_monitor_2_1777370363567.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 13:04 compact_monitor_2_1777370679314.mp4
-rw-r--r-- 1 lukas staff 268855 28 Apr 13:09 compact_monitor_2_1777370994284.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 13:15 compact_monitor_2_1777371309064.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 13:20 compact_monitor_2_1777371623643.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 13:25 compact_monitor_2_1777371938006.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 13:30 compact_monitor_2_1777372252120.mp4
-rw-r--r-- 1 lukas staff 266964 28 Apr 13:36 compact_monitor_2_1777372566394.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 13:41 compact_monitor_2_1777372880197.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 13:46 compact_monitor_2_1777373193667.mp4
-rw-r--r-- 1 lukas staff 265209 28 Apr 13:51 compact_monitor_2_1777373506832.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 13:56 compact_monitor_2_1777373816197.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 14:02 compact_monitor_2_1777374130774.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 14:07 compact_monitor_2_1777374443527.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 14:12 compact_monitor_2_1777374756405.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 14:17 compact_monitor_2_1777375070551.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 14:23 compact_monitor_2_1777375397987.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 14:28 compact_monitor_2_1777375715930.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 14:33 compact_monitor_2_1777376034152.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 14:39 compact_monitor_2_1777376348246.mp4
-rw-r--r-- 1 lukas staff 266019 28 Apr 14:44 compact_monitor_2_1777376657026.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 14:49 compact_monitor_2_1777376966683.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 14:54 compact_monitor_2_1777377280571.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:00 compact_monitor_2_1777377602616.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:05 compact_monitor_2_1777377915467.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 15:10 compact_monitor_2_1777378232424.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 15:15 compact_monitor_2_1777378547117.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:21 compact_monitor_2_1777378865359.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 15:26 compact_monitor_2_1777379183376.mp4
-rw-r--r-- 1 lukas staff 267774 28 Apr 15:31 compact_monitor_2_1777379502714.mp4
-rw-r--r-- 1 lukas staff 268046 28 Apr 15:37 compact_monitor_2_1777379819259.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 15:42 compact_monitor_2_1777380134674.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 15:47 compact_monitor_2_1777380454708.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 15:52 compact_monitor_2_1777380771150.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 15:58 compact_monitor_2_1777381086934.mp4
-rw-r--r-- 1 lukas staff 268044 28 Apr 16:03 compact_monitor_2_1777381401816.mp4
-rw-r--r-- 1 lukas staff 269530 28 Apr 16:08 compact_monitor_2_1777381720100.mp4
-rw-r--r-- 1 lukas staff 268721 28 Apr 16:13 compact_monitor_2_1777382037168.mp4
-rw-r--r-- 1 lukas staff 268583 28 Apr 16:19 compact_monitor_2_1777382355014.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 16:24 compact_monitor_2_1777382670965.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 16:29 compact_monitor_2_1777382984987.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 16:34 compact_monitor_2_1777383298084.mp4
-rw-r--r-- 1 lukas staff 236209 28 Apr 16:40 compact_monitor_2_1777383610070.mp4
-rw-r--r-- 1 lukas staff 1191690 28 Apr 17:01 compact_monitor_2_1777384877981.mp4
-rw-r--r-- 1 lukas staff 2975861 28 Apr 17:06 compact_monitor_2_1777385201736.mp4
-rw-r--r-- 1 lukas staff 5319560 28 Apr 17:12 compact_monitor_2_1777385529432.mp4
-rw-r--r-- 1 lukas staff 3006284 28 Apr 17:18 compact_monitor_2_1777385870812.mp4
-rw-r--r-- 1 lukas staff 2726877 28 Apr 17:23 compact_monitor_2_1777386204715.mp4
-rw-r--r-- 1 lukas staff 3315722 28 Apr 17:29 compact_monitor_2_1777386541280.mp4
-rw-r--r-- 1 lukas staff 1577465 28 Apr 17:34 compact_monitor_2_1777386883461.mp4
-rw-r--r-- 1 lukas staff 1745214 28 Apr 17:40 compact_monitor_2_1777387214543.mp4
-rw-r--r-- 1 lukas staff 950993 28 Apr 17:45 compact_monitor_2_1777387552842.mp4
-rw-r--r-- 1 lukas staff 429007 28 Apr 17:51 compact_monitor_2_1777387889075.mp4
-rw-r--r-- 1 lukas staff 884099 28 Apr 17:57 compact_monitor_2_1777388218623.mp4
-rw-r--r-- 1 lukas staff 2352504 28 Apr 18:02 compact_monitor_2_1777388548021.mp4
-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4
-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4
-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4
-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4
-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4
-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4
-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4
-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4
-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4
-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4
-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4
-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4
-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4
-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4
-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22523176
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 28 Apr 16:51 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite
-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm
-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 18:58:18] ========================================
[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27
[2026-05-06 18:58:18] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m04s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m06s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m07s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)
frames (7543 rows) ⠴ %
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 19:22:16] ========================================
[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27
[2026-05-06 19:22:16] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m01s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m03s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ✓ 4m40s
ocr_text (2193 rows) ✓ 0m25s
ui_events (9909 rows) ✓ 0m02s
elements (470235 rows) ✓ 2m46s
meetings (3 rows) ✓ 0m00s
[+08m07s] ▶ Updating FTS indexes
elements_fts ✓ 2m59s
frames_fts ✓ 6m07s
ui_events_fts ✓ 0m03s
[+17m16s] ▶ Verifying DB
frames: 7543 / 7543 ✓
elements: 470235 / 470235 ✓
ui_events: 9909 / 9909 ✓
ocr_text: 2193 / 2193 ✓
meetings: 3 / 3 ✓
[+18m46s] ▶ Copying data folder for 2026-04-27
rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)
[2026-05-06 19:41:28] Archive DB size: 9.7G
[2026-05-06 19:41:28] Total time: 19m12s
[2026-05-06 19:41:28] Sync complete for 2026-04-27
[2026-05-06 19:41:28] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28
[2026-05-06 19:44:49] ========================================
[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28
[2026-05-06 19:44:49] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (9.7G)
Data dir: OK (223 files, 159M)
[+00m00s] ▶ Counting source rows for 2026-04-28
frames: 4535
elements: 407532
ui_events: 8621
ocr_text: 1623
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m00s
creating FTS tables ✓ 0m00s
[+00m02s] ▶ Syncing data for 2026-04-28
video_chunks ✓ 0m12s
frames (4535 rows) ✓ 1m30s
ocr_text (1623 rows) ✓ 0m32s
ui_events (8621 rows) ✓ 0m01s
elements (407532 rows) ✓ 1m02s
meetings (3 rows) ✓ 0m00s
[+03m19s] ▶ Updating FTS indexes
elements_fts ✓ 1m36s
frames_fts ✓ 2m28s
ui_events_fts ✓ 0m04s
[+07m27s] ▶ Verifying DB
frames: 4535 / 4535 ✓
elements: 407532 / 407532 ✓
ui_events: 8621 / 8621 ✓
ocr_text: 1623 / 1623 ✓
meetings: 3 / 3 ✓
[+08m59s] ▶ Copying data folder for 2026-04-28
rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)
[2026-05-06 19:54:08] Archive DB size: 10G
[2026-05-06 19:54:08] Total time: 9m19s
[2026-05-06 19:54:08] Sync complete for 2026-04-28
[2026-05-06 19:54:08] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll
total 24
drwx------ 9 lukas staff 288 28 Apr 09:18 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
drwx------ 5 lukas staff 160 1 Nov 2021 _cacache
drwx------@ 2 lukas staff 64 28 Apr 09:18 _locks
drwx------ 15 lukas staff 480 27 Apr 19:54 _logs
drwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx
-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked
-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json
-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 52920
drwx------+ 92 lukas staff 2944 6 May 20:22 .
drwxr-xr-x 5 root admin 160 23 Aug 2024 ..
-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding
-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store
drwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash
drwx------ 5 lukas staff 160 1 Nov 2021 .aws
-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json
-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history
-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc
drwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito
drwx------@ 6 lukas staff 192 9 Apr 19:53 .cache
drwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude
-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json
drwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium
drwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer
drwx------ 16 lukas staff 512 21 May 2025 .config
drwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue
drwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot
drwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor
drwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor
drwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona
drwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb
drwx------ 24 lukas staff 768 27 Apr 18:14 .docker
drwx------ 15 lukas staff 480 6 Jun 2023 .dropbox
drwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak
-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth
-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig
-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp
drwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon
drwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc
-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst
drwx------ 5 lukas staff 160 23 Dec 2024 .local
-rw------- 1 lukas staff 204 16 Mar 2024 .netrc
drwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp
-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history
-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer
drwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py
drwx------ 8 lukas staff 256 6 May 20:24 .npm
-rw------- 1 lukas staff 74 20 May 2024 .npmrc
drwx------ 32 lukas staff 1024 25 Jul 2025 .nvm
drwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile
-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history
drwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode
drwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight
drwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint
drwx------ 15 lukas staff 480 8 Aug 2025 .ssh
drwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit
drwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm
-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
UW PICO 5.09 New Buffer
[ Read 1 line ]
^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos
^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell
drwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm
drwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf
drwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn
-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc
-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile
-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy
-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave
-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save
-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees
-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc
drwx------@ 9 lukas staff 288 20 Apr 20:55 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV
drwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads
drwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen
drwx------@ 112 lukas staff 3584 2 Dec 09:19 Library
drwx------ 7 lukas staff 224 12 Feb 2024 Movies
drwx------+ 5 lukas staff 160 25 Sep 2023 Music
drwx------+ 9 lukas staff 288 25 Sep 2023 Pictures
drwx------ 3 lukas staff 96 8 Nov 2021 Postman
drwx------+ 4 lukas staff 128 28 Oct 2021 Public
-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf
drwx------ 4 lukas staff 128 2 Jul 2023 Users
-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log
-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log
-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4
-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 2025 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast
-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin
-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh
-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
cd: no such file or directory: /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated
checking permissions...
screen recording: ok
microphone: ok
accessibility: ok
2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CF...
|
NULL
|
NULL
|
|
3
|
1
|
1
|
2026-05-06T17:27:46.571671+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778088466571_m1.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
-rw-r--r-- 1 lukas staff 397068 28 Apr 17:01 -rw-r--r-- 1 lukas staff 397068 28 Apr 17:01 compact_monitor_1_1777384874970.mp4
-rw-r--r-- 1 lukas staff 1592462 28 Apr 17:06 compact_monitor_1_1777385198571.mp4
-rw-r--r-- 1 lukas staff 1327809 28 Apr 17:12 compact_monitor_1_1777385523980.mp4
-rw-r--r-- 1 lukas staff 2262498 28 Apr 17:17 compact_monitor_1_1777385864559.mp4
-rw-r--r-- 1 lukas staff 1702453 28 Apr 17:23 compact_monitor_1_1777386198870.mp4
-rw-r--r-- 1 lukas staff 2034287 28 Apr 17:29 compact_monitor_1_1777386532344.mp4
-rw-r--r-- 1 lukas staff 1352893 28 Apr 17:34 compact_monitor_1_1777386875277.mp4
-rw-r--r-- 1 lukas staff 1873946 28 Apr 17:40 compact_monitor_1_1777387208685.mp4
-rw-r--r-- 1 lukas staff 1155463 28 Apr 17:45 compact_monitor_1_1777387548798.mp4
-rw-r--r-- 1 lukas staff 1428159 28 Apr 17:51 compact_monitor_1_1777387882691.mp4
-rw-r--r-- 1 lukas staff 1398484 28 Apr 17:56 compact_monitor_1_1777388213861.mp4
-rw-r--r-- 1 lukas staff 1688438 28 Apr 18:02 compact_monitor_1_1777388542869.mp4
-rw-r--r-- 1 lukas staff 2401161 28 Apr 18:07 compact_monitor_1_1777388869470.mp4
-rw-r--r-- 1 lukas staff 1283247 28 Apr 18:13 compact_monitor_1_1777389192202.mp4
-rw-r--r-- 1 lukas staff 1398160 28 Apr 18:18 compact_monitor_1_1777389525394.mp4
-rw-r--r-- 1 lukas staff 452906 28 Apr 18:24 compact_monitor_1_1777389856559.mp4
-rw-r--r-- 1 lukas staff 566518 28 Apr 18:29 compact_monitor_1_1777390191054.mp4
-rw-r--r-- 1 lukas staff 445894 28 Apr 18:35 compact_monitor_1_1777390513567.mp4
-rw-r--r-- 1 lukas staff 444044 28 Apr 18:40 compact_monitor_1_1777390841877.mp4
-rw-r--r-- 1 lukas staff 437853 28 Apr 18:46 compact_monitor_1_1777391162552.mp4
-rw-r--r-- 1 lukas staff 441008 28 Apr 18:51 compact_monitor_1_1777391489107.mp4
-rw-r--r-- 1 lukas staff 443934 28 Apr 18:57 compact_monitor_1_1777391823165.mp4
-rw-r--r-- 1 lukas staff 443624 28 Apr 19:02 compact_monitor_1_1777392146221.mp4
-rw-r--r-- 1 lukas staff 447164 28 Apr 19:07 compact_monitor_1_1777392469679.mp4
-rw-r--r-- 1 lukas staff 442431 28 Apr 19:13 compact_monitor_1_1777392792794.mp4
-rw-r--r-- 1 lukas staff 436805 28 Apr 19:18 compact_monitor_1_1777393109301.mp4
-rw-r--r-- 1 lukas staff 435633 28 Apr 19:23 compact_monitor_1_1777393423192.mp4
-rw-r--r-- 1 lukas staff 1162510 28 Apr 09:30 compact_monitor_2_1777357806702.mp4
-rw-r--r-- 1 lukas staff 3394878 28 Apr 09:35 compact_monitor_2_1777358126186.mp4
-rw-r--r-- 1 lukas staff 268044 28 Apr 09:40 compact_monitor_2_1777358443280.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 09:46 compact_monitor_2_1777358769231.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 09:51 compact_monitor_2_1777359084493.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 09:56 compact_monitor_2_1777359399758.mp4
-rw-r--r-- 1 lukas staff 266694 28 Apr 10:01 compact_monitor_2_1777359707884.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 10:06 compact_monitor_2_1777360016892.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 10:12 compact_monitor_2_1777360329199.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 10:17 compact_monitor_2_1777360641498.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 10:22 compact_monitor_2_1777360953971.mp4
-rw-r--r-- 1 lukas staff 267099 28 Apr 10:27 compact_monitor_2_1777361264266.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 10:33 compact_monitor_2_1777361583211.mp4
-rw-r--r-- 1 lukas staff 266829 28 Apr 10:38 compact_monitor_2_1777361903545.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 10:43 compact_monitor_2_1777362219032.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 10:48 compact_monitor_2_1777362532674.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 10:54 compact_monitor_2_1777362845950.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 10:59 compact_monitor_2_1777363157577.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 11:04 compact_monitor_2_1777363473776.mp4
-rw-r--r-- 1 lukas staff 267099 28 Apr 11:09 compact_monitor_2_1777363782342.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 11:14 compact_monitor_2_1777364092822.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 11:20 compact_monitor_2_1777364400840.mp4
-rw-r--r-- 1 lukas staff 266694 28 Apr 11:25 compact_monitor_2_1777364709144.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 11:30 compact_monitor_2_1777365022090.mp4
-rw-r--r-- 1 lukas staff 264669 28 Apr 11:35 compact_monitor_2_1777365335928.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 11:40 compact_monitor_2_1777365649137.mp4
-rw-r--r-- 1 lukas staff 266964 28 Apr 11:46 compact_monitor_2_1777365962619.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 11:51 compact_monitor_2_1777366273740.mp4
-rw-r--r-- 1 lukas staff 265209 28 Apr 11:56 compact_monitor_2_1777366582034.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 12:01 compact_monitor_2_1777366886631.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 12:06 compact_monitor_2_1777367202805.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 12:11 compact_monitor_2_1777367518861.mp4
-rw-r--r-- 1 lukas staff 269261 28 Apr 12:17 compact_monitor_2_1777367837441.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 12:22 compact_monitor_2_1777368160952.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 12:28 compact_monitor_2_1777368477571.mp4
-rw-r--r-- 1 lukas staff 267234 28 Apr 12:33 compact_monitor_2_1777368792600.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 12:38 compact_monitor_2_1777369107069.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 12:43 compact_monitor_2_1777369421530.mp4
-rw-r--r-- 1 lukas staff 266829 28 Apr 12:48 compact_monitor_2_1777369731189.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 12:54 compact_monitor_2_1777370048214.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 12:59 compact_monitor_2_1777370363567.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 13:04 compact_monitor_2_1777370679314.mp4
-rw-r--r-- 1 lukas staff 268855 28 Apr 13:09 compact_monitor_2_1777370994284.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 13:15 compact_monitor_2_1777371309064.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 13:20 compact_monitor_2_1777371623643.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 13:25 compact_monitor_2_1777371938006.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 13:30 compact_monitor_2_1777372252120.mp4
-rw-r--r-- 1 lukas staff 266964 28 Apr 13:36 compact_monitor_2_1777372566394.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 13:41 compact_monitor_2_1777372880197.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 13:46 compact_monitor_2_1777373193667.mp4
-rw-r--r-- 1 lukas staff 265209 28 Apr 13:51 compact_monitor_2_1777373506832.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 13:56 compact_monitor_2_1777373816197.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 14:02 compact_monitor_2_1777374130774.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 14:07 compact_monitor_2_1777374443527.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 14:12 compact_monitor_2_1777374756405.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 14:17 compact_monitor_2_1777375070551.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 14:23 compact_monitor_2_1777375397987.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 14:28 compact_monitor_2_1777375715930.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 14:33 compact_monitor_2_1777376034152.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 14:39 compact_monitor_2_1777376348246.mp4
-rw-r--r-- 1 lukas staff 266019 28 Apr 14:44 compact_monitor_2_1777376657026.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 14:49 compact_monitor_2_1777376966683.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 14:54 compact_monitor_2_1777377280571.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:00 compact_monitor_2_1777377602616.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:05 compact_monitor_2_1777377915467.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 15:10 compact_monitor_2_1777378232424.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 15:15 compact_monitor_2_1777378547117.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:21 compact_monitor_2_1777378865359.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 15:26 compact_monitor_2_1777379183376.mp4
-rw-r--r-- 1 lukas staff 267774 28 Apr 15:31 compact_monitor_2_1777379502714.mp4
-rw-r--r-- 1 lukas staff 268046 28 Apr 15:37 compact_monitor_2_1777379819259.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 15:42 compact_monitor_2_1777380134674.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 15:47 compact_monitor_2_1777380454708.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 15:52 compact_monitor_2_1777380771150.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 15:58 compact_monitor_2_1777381086934.mp4
-rw-r--r-- 1 lukas staff 268044 28 Apr 16:03 compact_monitor_2_1777381401816.mp4
-rw-r--r-- 1 lukas staff 269530 28 Apr 16:08 compact_monitor_2_1777381720100.mp4
-rw-r--r-- 1 lukas staff 268721 28 Apr 16:13 compact_monitor_2_1777382037168.mp4
-rw-r--r-- 1 lukas staff 268583 28 Apr 16:19 compact_monitor_2_1777382355014.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 16:24 compact_monitor_2_1777382670965.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 16:29 compact_monitor_2_1777382984987.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 16:34 compact_monitor_2_1777383298084.mp4
-rw-r--r-- 1 lukas staff 236209 28 Apr 16:40 compact_monitor_2_1777383610070.mp4
-rw-r--r-- 1 lukas staff 1191690 28 Apr 17:01 compact_monitor_2_1777384877981.mp4
-rw-r--r-- 1 lukas staff 2975861 28 Apr 17:06 compact_monitor_2_1777385201736.mp4
-rw-r--r-- 1 lukas staff 5319560 28 Apr 17:12 compact_monitor_2_1777385529432.mp4
-rw-r--r-- 1 lukas staff 3006284 28 Apr 17:18 compact_monitor_2_1777385870812.mp4
-rw-r--r-- 1 lukas staff 2726877 28 Apr 17:23 compact_monitor_2_1777386204715.mp4
-rw-r--r-- 1 lukas staff 3315722 28 Apr 17:29 compact_monitor_2_1777386541280.mp4
-rw-r--r-- 1 lukas staff 1577465 28 Apr 17:34 compact_monitor_2_1777386883461.mp4
-rw-r--r-- 1 lukas staff 1745214 28 Apr 17:40 compact_monitor_2_1777387214543.mp4
-rw-r--r-- 1 lukas staff 950993 28 Apr 17:45 compact_monitor_2_1777387552842.mp4
-rw-r--r-- 1 lukas staff 429007 28 Apr 17:51 compact_monitor_2_1777387889075.mp4
-rw-r--r-- 1 lukas staff 884099 28 Apr 17:57 compact_monitor_2_1777388218623.mp4
-rw-r--r-- 1 lukas staff 2352504 28 Apr 18:02 compact_monitor_2_1777388548021.mp4
-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4
-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4
-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4
-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4
-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4
-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4
-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4
-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4
-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4
-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4
-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4
-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4
-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4
-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4
-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22523176
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 28 Apr 16:51 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite
-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm
-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 18:58:18] ========================================
[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27
[2026-05-06 18:58:18] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m04s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m06s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m07s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)
frames (7543 rows) ⠴ %
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 19:22:16] ========================================
[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27
[2026-05-06 19:22:16] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m01s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m03s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ✓ 4m40s
ocr_text (2193 rows) ✓ 0m25s
ui_events (9909 rows) ✓ 0m02s
elements (470235 rows) ✓ 2m46s
meetings (3 rows) ✓ 0m00s
[+08m07s] ▶ Updating FTS indexes
elements_fts ✓ 2m59s
frames_fts ✓ 6m07s
ui_events_fts ✓ 0m03s
[+17m16s] ▶ Verifying DB
frames: 7543 / 7543 ✓
elements: 470235 / 470235 ✓
ui_events: 9909 / 9909 ✓
ocr_text: 2193 / 2193 ✓
meetings: 3 / 3 ✓
[+18m46s] ▶ Copying data folder for 2026-04-27
rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)
[2026-05-06 19:41:28] Archive DB size: 9.7G
[2026-05-06 19:41:28] Total time: 19m12s
[2026-05-06 19:41:28] Sync complete for 2026-04-27
[2026-05-06 19:41:28] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28
[2026-05-06 19:44:49] ========================================
[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28
[2026-05-06 19:44:49] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (9.7G)
Data dir: OK (223 files, 159M)
[+00m00s] ▶ Counting source rows for 2026-04-28
frames: 4535
elements: 407532
ui_events: 8621
ocr_text: 1623
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m00s
creating FTS tables ✓ 0m00s
[+00m02s] ▶ Syncing data for 2026-04-28
video_chunks ✓ 0m12s
frames (4535 rows) ✓ 1m30s
ocr_text (1623 rows) ✓ 0m32s
ui_events (8621 rows) ✓ 0m01s
elements (407532 rows) ✓ 1m02s
meetings (3 rows) ✓ 0m00s
[+03m19s] ▶ Updating FTS indexes
elements_fts ✓ 1m36s
frames_fts ✓ 2m28s
ui_events_fts ✓ 0m04s
[+07m27s] ▶ Verifying DB
frames: 4535 / 4535 ✓
elements: 407532 / 407532 ✓
ui_events: 8621 / 8621 ✓
ocr_text: 1623 / 1623 ✓
meetings: 3 / 3 ✓
[+08m59s] ▶ Copying data folder for 2026-04-28
rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)
[2026-05-06 19:54:08] Archive DB size: 10G
[2026-05-06 19:54:08] Total time: 9m19s
[2026-05-06 19:54:08] Sync complete for 2026-04-28
[2026-05-06 19:54:08] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll
total 24
drwx------ 9 lukas staff 288 28 Apr 09:18 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
drwx------ 5 lukas staff 160 1 Nov 2021 _cacache
drwx------@ 2 lukas staff 64 28 Apr 09:18 _locks
drwx------ 15 lukas staff 480 27 Apr 19:54 _logs
drwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx
-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked
-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json
-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 52920
drwx------+ 92 lukas staff 2944 6 May 20:22 .
drwxr-xr-x 5 root admin 160 23 Aug 2024 ..
-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding
-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store
drwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash
drwx------ 5 lukas staff 160 1 Nov 2021 .aws
-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json
-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history
-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc
drwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito
drwx------@ 6 lukas staff 192 9 Apr 19:53 .cache
drwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude
-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json
drwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium
drwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer
drwx------ 16 lukas staff 512 21 May 2025 .config
drwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue
drwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot
drwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor
drwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor
drwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona
drwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb
drwx------ 24 lukas staff 768 27 Apr 18:14 .docker
drwx------ 15 lukas staff 480 6 Jun 2023 .dropbox
drwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak
-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth
-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig
-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp
drwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon
drwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc
-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst
drwx------ 5 lukas staff 160 23 Dec 2024 .local
-rw------- 1 lukas staff 204 16 Mar 2024 .netrc
drwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp
-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history
-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer
drwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py
drwx------ 8 lukas staff 256 6 May 20:24 .npm
-rw------- 1 lukas staff 74 20 May 2024 .npmrc
drwx------ 32 lukas staff 1024 25 Jul 2025 .nvm
drwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile
-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history
drwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode
drwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight
drwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint
drwx------ 15 lukas staff 480 8 Aug 2025 .ssh
drwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit
drwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm
-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
UW PICO 5.09 New Buffer
[ Read 1 line ]
^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos
^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell
drwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm
drwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf
drwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn
-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc
-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile
-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy
-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave
-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save
-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees
-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc
drwx------@ 9 lukas staff 288 20 Apr 20:55 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV
drwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads
drwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen
drwx------@ 112 lukas staff 3584 2 Dec 09:19 Library
drwx------ 7 lukas staff 224 12 Feb 2024 Movies
drwx------+ 5 lukas staff 160 25 Sep 2023 Music
drwx------+ 9 lukas staff 288 25 Sep 2023 Pictures
drwx------ 3 lukas staff 96 8 Nov 2021 Postman
drwx------+ 4 lukas staff 128 28 Oct 2021 Public
-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf
drwx------ 4 lukas staff 128 2 Jul 2023 Users
-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log
-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log
-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4
-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 2025 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast
-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin
-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh
-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
cd: no such file or directory: /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated
checking permissions...
screen recording: ok
microphone: ok
accessibility: ok
2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap
2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update
2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits
2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown
2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export
2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary
2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ false │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 7 │
│ retention mode │ media-only (keep transcripts) │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ MacBook Pro Microphone (input) │
│ │ System Audio (output) │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your d...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"-rw-r--r-- 1 lukas staff 397068 28 Apr 17:01 compact_monitor_1_1777384874970.mp4\n-rw-r--r-- 1 lukas staff 1592462 28 Apr 17:06 compact_monitor_1_1777385198571.mp4\n-rw-r--r-- 1 lukas staff 1327809 28 Apr 17:12 compact_monitor_1_1777385523980.mp4\n-rw-r--r-- 1 lukas staff 2262498 28 Apr 17:17 compact_monitor_1_1777385864559.mp4\n-rw-r--r-- 1 lukas staff 1702453 28 Apr 17:23 compact_monitor_1_1777386198870.mp4\n-rw-r--r-- 1 lukas staff 2034287 28 Apr 17:29 compact_monitor_1_1777386532344.mp4\n-rw-r--r-- 1 lukas staff 1352893 28 Apr 17:34 compact_monitor_1_1777386875277.mp4\n-rw-r--r-- 1 lukas staff 1873946 28 Apr 17:40 compact_monitor_1_1777387208685.mp4\n-rw-r--r-- 1 lukas staff 1155463 28 Apr 17:45 compact_monitor_1_1777387548798.mp4\n-rw-r--r-- 1 lukas staff 1428159 28 Apr 17:51 compact_monitor_1_1777387882691.mp4\n-rw-r--r-- 1 lukas staff 1398484 28 Apr 17:56 compact_monitor_1_1777388213861.mp4\n-rw-r--r-- 1 lukas staff 1688438 28 Apr 18:02 compact_monitor_1_1777388542869.mp4\n-rw-r--r-- 1 lukas staff 2401161 28 Apr 18:07 compact_monitor_1_1777388869470.mp4\n-rw-r--r-- 1 lukas staff 1283247 28 Apr 18:13 compact_monitor_1_1777389192202.mp4\n-rw-r--r-- 1 lukas staff 1398160 28 Apr 18:18 compact_monitor_1_1777389525394.mp4\n-rw-r--r-- 1 lukas staff 452906 28 Apr 18:24 compact_monitor_1_1777389856559.mp4\n-rw-r--r-- 1 lukas staff 566518 28 Apr 18:29 compact_monitor_1_1777390191054.mp4\n-rw-r--r-- 1 lukas staff 445894 28 Apr 18:35 compact_monitor_1_1777390513567.mp4\n-rw-r--r-- 1 lukas staff 444044 28 Apr 18:40 compact_monitor_1_1777390841877.mp4\n-rw-r--r-- 1 lukas staff 437853 28 Apr 18:46 compact_monitor_1_1777391162552.mp4\n-rw-r--r-- 1 lukas staff 441008 28 Apr 18:51 compact_monitor_1_1777391489107.mp4\n-rw-r--r-- 1 lukas staff 443934 28 Apr 18:57 compact_monitor_1_1777391823165.mp4\n-rw-r--r-- 1 lukas staff 443624 28 Apr 19:02 compact_monitor_1_1777392146221.mp4\n-rw-r--r-- 1 lukas staff 447164 28 Apr 19:07 compact_monitor_1_1777392469679.mp4\n-rw-r--r-- 1 lukas staff 442431 28 Apr 19:13 compact_monitor_1_1777392792794.mp4\n-rw-r--r-- 1 lukas staff 436805 28 Apr 19:18 compact_monitor_1_1777393109301.mp4\n-rw-r--r-- 1 lukas staff 435633 28 Apr 19:23 compact_monitor_1_1777393423192.mp4\n-rw-r--r-- 1 lukas staff 1162510 28 Apr 09:30 compact_monitor_2_1777357806702.mp4\n-rw-r--r-- 1 lukas staff 3394878 28 Apr 09:35 compact_monitor_2_1777358126186.mp4\n-rw-r--r-- 1 lukas staff 268044 28 Apr 09:40 compact_monitor_2_1777358443280.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 09:46 compact_monitor_2_1777358769231.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 09:51 compact_monitor_2_1777359084493.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 09:56 compact_monitor_2_1777359399758.mp4\n-rw-r--r-- 1 lukas staff 266694 28 Apr 10:01 compact_monitor_2_1777359707884.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 10:06 compact_monitor_2_1777360016892.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 10:12 compact_monitor_2_1777360329199.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 10:17 compact_monitor_2_1777360641498.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 10:22 compact_monitor_2_1777360953971.mp4\n-rw-r--r-- 1 lukas staff 267099 28 Apr 10:27 compact_monitor_2_1777361264266.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 10:33 compact_monitor_2_1777361583211.mp4\n-rw-r--r-- 1 lukas staff 266829 28 Apr 10:38 compact_monitor_2_1777361903545.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 10:43 compact_monitor_2_1777362219032.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 10:48 compact_monitor_2_1777362532674.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 10:54 compact_monitor_2_1777362845950.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 10:59 compact_monitor_2_1777363157577.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 11:04 compact_monitor_2_1777363473776.mp4\n-rw-r--r-- 1 lukas staff 267099 28 Apr 11:09 compact_monitor_2_1777363782342.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 11:14 compact_monitor_2_1777364092822.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 11:20 compact_monitor_2_1777364400840.mp4\n-rw-r--r-- 1 lukas staff 266694 28 Apr 11:25 compact_monitor_2_1777364709144.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 11:30 compact_monitor_2_1777365022090.mp4\n-rw-r--r-- 1 lukas staff 264669 28 Apr 11:35 compact_monitor_2_1777365335928.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 11:40 compact_monitor_2_1777365649137.mp4\n-rw-r--r-- 1 lukas staff 266964 28 Apr 11:46 compact_monitor_2_1777365962619.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 11:51 compact_monitor_2_1777366273740.mp4\n-rw-r--r-- 1 lukas staff 265209 28 Apr 11:56 compact_monitor_2_1777366582034.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 12:01 compact_monitor_2_1777366886631.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 12:06 compact_monitor_2_1777367202805.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 12:11 compact_monitor_2_1777367518861.mp4\n-rw-r--r-- 1 lukas staff 269261 28 Apr 12:17 compact_monitor_2_1777367837441.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 12:22 compact_monitor_2_1777368160952.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 12:28 compact_monitor_2_1777368477571.mp4\n-rw-r--r-- 1 lukas staff 267234 28 Apr 12:33 compact_monitor_2_1777368792600.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 12:38 compact_monitor_2_1777369107069.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 12:43 compact_monitor_2_1777369421530.mp4\n-rw-r--r-- 1 lukas staff 266829 28 Apr 12:48 compact_monitor_2_1777369731189.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 12:54 compact_monitor_2_1777370048214.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 12:59 compact_monitor_2_1777370363567.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 13:04 compact_monitor_2_1777370679314.mp4\n-rw-r--r-- 1 lukas staff 268855 28 Apr 13:09 compact_monitor_2_1777370994284.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 13:15 compact_monitor_2_1777371309064.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 13:20 compact_monitor_2_1777371623643.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 13:25 compact_monitor_2_1777371938006.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 13:30 compact_monitor_2_1777372252120.mp4\n-rw-r--r-- 1 lukas staff 266964 28 Apr 13:36 compact_monitor_2_1777372566394.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 13:41 compact_monitor_2_1777372880197.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 13:46 compact_monitor_2_1777373193667.mp4\n-rw-r--r-- 1 lukas staff 265209 28 Apr 13:51 compact_monitor_2_1777373506832.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 13:56 compact_monitor_2_1777373816197.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 14:02 compact_monitor_2_1777374130774.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 14:07 compact_monitor_2_1777374443527.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 14:12 compact_monitor_2_1777374756405.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 14:17 compact_monitor_2_1777375070551.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 14:23 compact_monitor_2_1777375397987.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 14:28 compact_monitor_2_1777375715930.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 14:33 compact_monitor_2_1777376034152.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 14:39 compact_monitor_2_1777376348246.mp4\n-rw-r--r-- 1 lukas staff 266019 28 Apr 14:44 compact_monitor_2_1777376657026.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 14:49 compact_monitor_2_1777376966683.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 14:54 compact_monitor_2_1777377280571.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:00 compact_monitor_2_1777377602616.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:05 compact_monitor_2_1777377915467.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 15:10 compact_monitor_2_1777378232424.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 15:15 compact_monitor_2_1777378547117.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:21 compact_monitor_2_1777378865359.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 15:26 compact_monitor_2_1777379183376.mp4\n-rw-r--r-- 1 lukas staff 267774 28 Apr 15:31 compact_monitor_2_1777379502714.mp4\n-rw-r--r-- 1 lukas staff 268046 28 Apr 15:37 compact_monitor_2_1777379819259.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 15:42 compact_monitor_2_1777380134674.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 15:47 compact_monitor_2_1777380454708.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 15:52 compact_monitor_2_1777380771150.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 15:58 compact_monitor_2_1777381086934.mp4\n-rw-r--r-- 1 lukas staff 268044 28 Apr 16:03 compact_monitor_2_1777381401816.mp4\n-rw-r--r-- 1 lukas staff 269530 28 Apr 16:08 compact_monitor_2_1777381720100.mp4\n-rw-r--r-- 1 lukas staff 268721 28 Apr 16:13 compact_monitor_2_1777382037168.mp4\n-rw-r--r-- 1 lukas staff 268583 28 Apr 16:19 compact_monitor_2_1777382355014.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 16:24 compact_monitor_2_1777382670965.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 16:29 compact_monitor_2_1777382984987.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 16:34 compact_monitor_2_1777383298084.mp4\n-rw-r--r-- 1 lukas staff 236209 28 Apr 16:40 compact_monitor_2_1777383610070.mp4\n-rw-r--r-- 1 lukas staff 1191690 28 Apr 17:01 compact_monitor_2_1777384877981.mp4\n-rw-r--r-- 1 lukas staff 2975861 28 Apr 17:06 compact_monitor_2_1777385201736.mp4\n-rw-r--r-- 1 lukas staff 5319560 28 Apr 17:12 compact_monitor_2_1777385529432.mp4\n-rw-r--r-- 1 lukas staff 3006284 28 Apr 17:18 compact_monitor_2_1777385870812.mp4\n-rw-r--r-- 1 lukas staff 2726877 28 Apr 17:23 compact_monitor_2_1777386204715.mp4\n-rw-r--r-- 1 lukas staff 3315722 28 Apr 17:29 compact_monitor_2_1777386541280.mp4\n-rw-r--r-- 1 lukas staff 1577465 28 Apr 17:34 compact_monitor_2_1777386883461.mp4\n-rw-r--r-- 1 lukas staff 1745214 28 Apr 17:40 compact_monitor_2_1777387214543.mp4\n-rw-r--r-- 1 lukas staff 950993 28 Apr 17:45 compact_monitor_2_1777387552842.mp4\n-rw-r--r-- 1 lukas staff 429007 28 Apr 17:51 compact_monitor_2_1777387889075.mp4\n-rw-r--r-- 1 lukas staff 884099 28 Apr 17:57 compact_monitor_2_1777388218623.mp4\n-rw-r--r-- 1 lukas staff 2352504 28 Apr 18:02 compact_monitor_2_1777388548021.mp4\n-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4\n-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4\n-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4\n-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4\n-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4\n-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4\n-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4\n-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4\n-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4\n-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4\n-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4\n-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4\n-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4\n-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4\n-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22523176\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 28 Apr 16:51 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite\n-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27 \n[2026-05-06 18:58:18] ========================================\n[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 18:58:18] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m04s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m06s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m07s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)\n frames (7543 rows) ⠴ % \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27\n[2026-05-06 19:22:16] ========================================\n[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 19:22:16] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m01s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m03s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ✓ 4m40s\n ocr_text (2193 rows) ✓ 0m25s\n ui_events (9909 rows) ✓ 0m02s\n elements (470235 rows) ✓ 2m46s\n meetings (3 rows) ✓ 0m00s\n\n[+08m07s] ▶ Updating FTS indexes\n elements_fts ✓ 2m59s\n frames_fts ✓ 6m07s\n ui_events_fts ✓ 0m03s\n\n[+17m16s] ▶ Verifying DB\n frames: 7543 / 7543 ✓\n elements: 470235 / 470235 ✓\n ui_events: 9909 / 9909 ✓\n ocr_text: 2193 / 2193 ✓\n meetings: 3 / 3 ✓\n\n[+18m46s] ▶ Copying data folder for 2026-04-27\n rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)\n\n[2026-05-06 19:41:28] Archive DB size: 9.7G\n[2026-05-06 19:41:28] Total time: 19m12s\n[2026-05-06 19:41:28] Sync complete for 2026-04-27\n[2026-05-06 19:41:28] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28\n[2026-05-06 19:44:49] ========================================\n[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28\n[2026-05-06 19:44:49] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (9.7G)\n Data dir: OK (223 files, 159M)\n\n[+00m00s] ▶ Counting source rows for 2026-04-28\n frames: 4535\n elements: 407532\n ui_events: 8621\n ocr_text: 1623\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m00s\n creating FTS tables ✓ 0m00s\n\n[+00m02s] ▶ Syncing data for 2026-04-28\n video_chunks ✓ 0m12s\n frames (4535 rows) ✓ 1m30s\n ocr_text (1623 rows) ✓ 0m32s\n ui_events (8621 rows) ✓ 0m01s\n elements (407532 rows) ✓ 1m02s\n meetings (3 rows) ✓ 0m00s\n\n[+03m19s] ▶ Updating FTS indexes\n elements_fts ✓ 1m36s\n frames_fts ✓ 2m28s\n ui_events_fts ✓ 0m04s\n\n[+07m27s] ▶ Verifying DB\n frames: 4535 / 4535 ✓\n elements: 407532 / 407532 ✓\n ui_events: 8621 / 8621 ✓\n ocr_text: 1623 / 1623 ✓\n meetings: 3 / 3 ✓\n\n[+08m59s] ▶ Copying data folder for 2026-04-28\n rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)\n\n[2026-05-06 19:54:08] Archive DB size: 10G\n[2026-05-06 19:54:08] Total time: 9m19s\n[2026-05-06 19:54:08] Sync complete for 2026-04-28\n[2026-05-06 19:54:08] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll\ntotal 24\ndrwx------ 9 lukas staff 288 28 Apr 09:18 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\ndrwx------ 5 lukas staff 160 1 Nov 2021 _cacache\ndrwx------@ 2 lukas staff 64 28 Apr 09:18 _locks\ndrwx------ 15 lukas staff 480 27 Apr 19:54 _logs\ndrwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx\n-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked\n-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json\n-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll \ntotal 52920\ndrwx------+ 92 lukas staff 2944 6 May 20:22 .\ndrwxr-xr-x 5 root admin 160 23 Aug 2024 ..\n-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding\n-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store\ndrwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash\ndrwx------ 5 lukas staff 160 1 Nov 2021 .aws\n-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json\n-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history\n-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc\ndrwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito\ndrwx------@ 6 lukas staff 192 9 Apr 19:53 .cache\ndrwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude\n-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json\ndrwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium\ndrwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer\ndrwx------ 16 lukas staff 512 21 May 2025 .config\ndrwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue\ndrwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot\ndrwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor\ndrwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor\ndrwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona\ndrwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb\ndrwx------ 24 lukas staff 768 27 Apr 18:14 .docker\ndrwx------ 15 lukas staff 480 6 Jun 2023 .dropbox\ndrwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak\n-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth\n-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig\n-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp\ndrwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon\ndrwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc\n-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst\ndrwx------ 5 lukas staff 160 23 Dec 2024 .local\n-rw------- 1 lukas staff 204 16 Mar 2024 .netrc\ndrwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp\n-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history\n-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer\ndrwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py\ndrwx------ 8 lukas staff 256 6 May 20:24 .npm\n-rw------- 1 lukas staff 74 20 May 2024 .npmrc\ndrwx------ 32 lukas staff 1024 25 Jul 2025 .nvm\ndrwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile\n-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history\ndrwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode\ndrwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight\ndrwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint\ndrwx------ 15 lukas staff 480 8 Aug 2025 .ssh\ndrwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit\ndrwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm\n-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\n UW PICO 5.09 New Buffer \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n [ Read 1 line ] \n^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos \n^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell \ndrwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm\ndrwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf\ndrwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn\n-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc\n-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile\n-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy\n-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave\n-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save\n-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees\n-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc\ndrwx------@ 9 lukas staff 288 20 Apr 20:55 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV\ndrwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads\ndrwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen\ndrwx------@ 112 lukas staff 3584 2 Dec 09:19 Library\ndrwx------ 7 lukas staff 224 12 Feb 2024 Movies\ndrwx------+ 5 lukas staff 160 25 Sep 2023 Music\ndrwx------+ 9 lukas staff 288 25 Sep 2023 Pictures\ndrwx------ 3 lukas staff 96 8 Nov 2021 Postman\ndrwx------+ 4 lukas staff 128 28 Oct 2021 Public\n-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf\ndrwx------ 4 lukas staff 128 2 Jul 2023 Users\n-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log\n-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 2025 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast\n-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin\n-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh\n-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe\ncd: no such file or directory: /Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated\nchecking permissions...\n screen recording: ok\n microphone: ok\n accessibility: ok\n2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap\n2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update\n2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits\n2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown\n2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export\n2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary\n2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ false │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n│ retention mode │ media-only (keep transcripts) │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ MacBook Pro Microphone (input) │\n│ │ System Audio (output) │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-05-06T20:27:34.638384Z INFO screenpipe: starting UI event capture\n2026-05-06T20:27:34.637679Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-05-06T20:27:34.649154Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(94))\n2026-05-06T20:27:34.652794Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-05-06T20:27:34.655839Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-05-06T20:27:34.673877Z INFO screenpipe_engine::ui_recorder: UI recording session started: 54869993-7b4b-491f-b717-2a583517f9c5\n2026-05-06T20:27:34.673910Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-05-06T20:27:34.674057Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-05-05 17:27:34.674056 UTC to 2026-05-06 17:27:34.674056 UTC)\n2026-05-06T20:27:34.674892Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-05-06T20:27:34.675788Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 0 frame entries, coverage from 2026-05-05 17:27:34.674056 UTC\n2026-05-06T20:27:34.686546Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-05-06T20:27:34.691371Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-05-06T20:27:36.270608Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-05-06T20:27:36.270669Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.270714Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.932583Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-05-06T20:27:36.932852Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-05-06T20:27:36.932882Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-05-06T20:27:36.932899Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-05-06T20:27:36.932901Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-05-06T20:27:39.158281Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 3 excluded)\n2026-05-06T20:27:39.593177Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1, dur=101ms\n2026-05-06T20:27:40.672366Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)\n2026-05-06T20:27:41.257664Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=2, dur=140ms\n2026-05-06T20:27:44.641022Z INFO screenpipe_audio::transcription::engine: whisper model available: \"/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin\"\n2026-05-06T20:27:44.641079Z INFO screenpipe_audio::transcription::whisper::model: whisper context: gpu acceleration enabled (Metal on macOS, Vulkan on Windows)\n2026-05-06T20:27:44.641086Z INFO screenpipe_audio::transcription::engine: loading whisper model with GPU acceleration...\nwhisper_init_from_file_with_params_no_state: loading model from '/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin'\nwhisper_init_with_params_no_state: use gpu = 1\nwhisper_init_with_params_no_state: flash attn = 0\nwhisper_init_with_params_no_state: gpu_device = 0\nwhisper_init_with_params_no_state: dtw = 0\nggml_metal_device_init: tensor API disabled for pre-M5 and pre-A19 devices\nggml_metal_library_init: using embedded metal library\nggml_metal_library_init: loaded in 0.041 sec\nggml_metal_rsets_init: creating a residency set collection (keep_alive = 180 s)\nggml_metal_device_init: GPU name: Apple M1\nggml_metal_device_init: GPU family: MTLGPUFamilyApple7 (1007)\nggml_metal_device_init: GPU family: MTLGPUFamilyCommon3 (3003)\nggml_metal_device_init: GPU family: MTLGPUFamilyMetal3 (5001)\nggml_metal_device_init: simdgroup reduction = true\nggml_metal_device_init: simdgroup matrix mul. = true\nggml_metal_device_init: has unified memory = true\nggml_metal_device_init: has bfloat = true\nggml_metal_device_init: has tensor = false\nggml_metal_device_init: use residency sets = true\nggml_metal_device_init: use shared buffers = true\nggml_metal_device_init: recommendedMaxWorkingSetSize = 11453.25 MB\nwhisper_init_with_params_no_state: devices = 3\nwhisper_init_with_params_no_state: backends = 3\nwhisper_model_load: loading model\nwhisper_model_load: n_vocab = 51865\nwhisper_model_load: n_audio_ctx = 1500\nwhisper_model_load: n_audio_state = 384\nwhisper_model_load: n_audio_head = 6\nwhisper_model_load: n_audio_layer = 4\nwhisper_model_load: n_text_ctx = 448\nwhisper_model_load: n_text_state = 384\nwhisper_model_load: n_text_head = 6\nwhisper_model_load: n_text_layer = 4\nwhisper_model_load: n_mels = 80\nwhisper_model_load: ftype = 1\nwhisper_model_load: qntvr = 0\nwhisper_model_load: type = 1 (tiny)\nwhisper_model_load: adding 1608 extra tokens\nwhisper_model_load: n_langs = 99\nwhisper_model_load: Metal total size = 77.11 MB\nwhisper_model_load: model size = 77.11 MB\n2026-05-06T20:27:44.857210Z INFO screenpipe_audio::transcription::engine: whisper model loaded successfully\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\n2026-05-06T20:27:44.861912Z INFO screenpipe_audio::audio_manager::manager: transcription session created (will be reused across segments)\n2026-05-06T20:27:44.862480Z INFO screenpipe_audio::audio_manager::manager: audio manager started\n2026-05-06T20:27:44.862525Z INFO screenpipe_audio::audio_manager::manager: calendar-assisted speaker diarization: listening for meeting events","depth":4,"on_screen":true,"value":"-rw-r--r-- 1 lukas staff 397068 28 Apr 17:01 compact_monitor_1_1777384874970.mp4\n-rw-r--r-- 1 lukas staff 1592462 28 Apr 17:06 compact_monitor_1_1777385198571.mp4\n-rw-r--r-- 1 lukas staff 1327809 28 Apr 17:12 compact_monitor_1_1777385523980.mp4\n-rw-r--r-- 1 lukas staff 2262498 28 Apr 17:17 compact_monitor_1_1777385864559.mp4\n-rw-r--r-- 1 lukas staff 1702453 28 Apr 17:23 compact_monitor_1_1777386198870.mp4\n-rw-r--r-- 1 lukas staff 2034287 28 Apr 17:29 compact_monitor_1_1777386532344.mp4\n-rw-r--r-- 1 lukas staff 1352893 28 Apr 17:34 compact_monitor_1_1777386875277.mp4\n-rw-r--r-- 1 lukas staff 1873946 28 Apr 17:40 compact_monitor_1_1777387208685.mp4\n-rw-r--r-- 1 lukas staff 1155463 28 Apr 17:45 compact_monitor_1_1777387548798.mp4\n-rw-r--r-- 1 lukas staff 1428159 28 Apr 17:51 compact_monitor_1_1777387882691.mp4\n-rw-r--r-- 1 lukas staff 1398484 28 Apr 17:56 compact_monitor_1_1777388213861.mp4\n-rw-r--r-- 1 lukas staff 1688438 28 Apr 18:02 compact_monitor_1_1777388542869.mp4\n-rw-r--r-- 1 lukas staff 2401161 28 Apr 18:07 compact_monitor_1_1777388869470.mp4\n-rw-r--r-- 1 lukas staff 1283247 28 Apr 18:13 compact_monitor_1_1777389192202.mp4\n-rw-r--r-- 1 lukas staff 1398160 28 Apr 18:18 compact_monitor_1_1777389525394.mp4\n-rw-r--r-- 1 lukas staff 452906 28 Apr 18:24 compact_monitor_1_1777389856559.mp4\n-rw-r--r-- 1 lukas staff 566518 28 Apr 18:29 compact_monitor_1_1777390191054.mp4\n-rw-r--r-- 1 lukas staff 445894 28 Apr 18:35 compact_monitor_1_1777390513567.mp4\n-rw-r--r-- 1 lukas staff 444044 28 Apr 18:40 compact_monitor_1_1777390841877.mp4\n-rw-r--r-- 1 lukas staff 437853 28 Apr 18:46 compact_monitor_1_1777391162552.mp4\n-rw-r--r-- 1 lukas staff 441008 28 Apr 18:51 compact_monitor_1_1777391489107.mp4\n-rw-r--r-- 1 lukas staff 443934 28 Apr 18:57 compact_monitor_1_1777391823165.mp4\n-rw-r--r-- 1 lukas staff 443624 28 Apr 19:02 compact_monitor_1_1777392146221.mp4\n-rw-r--r-- 1 lukas staff 447164 28 Apr 19:07 compact_monitor_1_1777392469679.mp4\n-rw-r--r-- 1 lukas staff 442431 28 Apr 19:13 compact_monitor_1_1777392792794.mp4\n-rw-r--r-- 1 lukas staff 436805 28 Apr 19:18 compact_monitor_1_1777393109301.mp4\n-rw-r--r-- 1 lukas staff 435633 28 Apr 19:23 compact_monitor_1_1777393423192.mp4\n-rw-r--r-- 1 lukas staff 1162510 28 Apr 09:30 compact_monitor_2_1777357806702.mp4\n-rw-r--r-- 1 lukas staff 3394878 28 Apr 09:35 compact_monitor_2_1777358126186.mp4\n-rw-r--r-- 1 lukas staff 268044 28 Apr 09:40 compact_monitor_2_1777358443280.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 09:46 compact_monitor_2_1777358769231.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 09:51 compact_monitor_2_1777359084493.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 09:56 compact_monitor_2_1777359399758.mp4\n-rw-r--r-- 1 lukas staff 266694 28 Apr 10:01 compact_monitor_2_1777359707884.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 10:06 compact_monitor_2_1777360016892.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 10:12 compact_monitor_2_1777360329199.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 10:17 compact_monitor_2_1777360641498.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 10:22 compact_monitor_2_1777360953971.mp4\n-rw-r--r-- 1 lukas staff 267099 28 Apr 10:27 compact_monitor_2_1777361264266.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 10:33 compact_monitor_2_1777361583211.mp4\n-rw-r--r-- 1 lukas staff 266829 28 Apr 10:38 compact_monitor_2_1777361903545.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 10:43 compact_monitor_2_1777362219032.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 10:48 compact_monitor_2_1777362532674.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 10:54 compact_monitor_2_1777362845950.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 10:59 compact_monitor_2_1777363157577.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 11:04 compact_monitor_2_1777363473776.mp4\n-rw-r--r-- 1 lukas staff 267099 28 Apr 11:09 compact_monitor_2_1777363782342.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 11:14 compact_monitor_2_1777364092822.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 11:20 compact_monitor_2_1777364400840.mp4\n-rw-r--r-- 1 lukas staff 266694 28 Apr 11:25 compact_monitor_2_1777364709144.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 11:30 compact_monitor_2_1777365022090.mp4\n-rw-r--r-- 1 lukas staff 264669 28 Apr 11:35 compact_monitor_2_1777365335928.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 11:40 compact_monitor_2_1777365649137.mp4\n-rw-r--r-- 1 lukas staff 266964 28 Apr 11:46 compact_monitor_2_1777365962619.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 11:51 compact_monitor_2_1777366273740.mp4\n-rw-r--r-- 1 lukas staff 265209 28 Apr 11:56 compact_monitor_2_1777366582034.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 12:01 compact_monitor_2_1777366886631.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 12:06 compact_monitor_2_1777367202805.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 12:11 compact_monitor_2_1777367518861.mp4\n-rw-r--r-- 1 lukas staff 269261 28 Apr 12:17 compact_monitor_2_1777367837441.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 12:22 compact_monitor_2_1777368160952.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 12:28 compact_monitor_2_1777368477571.mp4\n-rw-r--r-- 1 lukas staff 267234 28 Apr 12:33 compact_monitor_2_1777368792600.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 12:38 compact_monitor_2_1777369107069.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 12:43 compact_monitor_2_1777369421530.mp4\n-rw-r--r-- 1 lukas staff 266829 28 Apr 12:48 compact_monitor_2_1777369731189.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 12:54 compact_monitor_2_1777370048214.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 12:59 compact_monitor_2_1777370363567.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 13:04 compact_monitor_2_1777370679314.mp4\n-rw-r--r-- 1 lukas staff 268855 28 Apr 13:09 compact_monitor_2_1777370994284.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 13:15 compact_monitor_2_1777371309064.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 13:20 compact_monitor_2_1777371623643.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 13:25 compact_monitor_2_1777371938006.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 13:30 compact_monitor_2_1777372252120.mp4\n-rw-r--r-- 1 lukas staff 266964 28 Apr 13:36 compact_monitor_2_1777372566394.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 13:41 compact_monitor_2_1777372880197.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 13:46 compact_monitor_2_1777373193667.mp4\n-rw-r--r-- 1 lukas staff 265209 28 Apr 13:51 compact_monitor_2_1777373506832.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 13:56 compact_monitor_2_1777373816197.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 14:02 compact_monitor_2_1777374130774.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 14:07 compact_monitor_2_1777374443527.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 14:12 compact_monitor_2_1777374756405.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 14:17 compact_monitor_2_1777375070551.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 14:23 compact_monitor_2_1777375397987.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 14:28 compact_monitor_2_1777375715930.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 14:33 compact_monitor_2_1777376034152.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 14:39 compact_monitor_2_1777376348246.mp4\n-rw-r--r-- 1 lukas staff 266019 28 Apr 14:44 compact_monitor_2_1777376657026.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 14:49 compact_monitor_2_1777376966683.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 14:54 compact_monitor_2_1777377280571.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:00 compact_monitor_2_1777377602616.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:05 compact_monitor_2_1777377915467.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 15:10 compact_monitor_2_1777378232424.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 15:15 compact_monitor_2_1777378547117.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:21 compact_monitor_2_1777378865359.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 15:26 compact_monitor_2_1777379183376.mp4\n-rw-r--r-- 1 lukas staff 267774 28 Apr 15:31 compact_monitor_2_1777379502714.mp4\n-rw-r--r-- 1 lukas staff 268046 28 Apr 15:37 compact_monitor_2_1777379819259.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 15:42 compact_monitor_2_1777380134674.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 15:47 compact_monitor_2_1777380454708.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 15:52 compact_monitor_2_1777380771150.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 15:58 compact_monitor_2_1777381086934.mp4\n-rw-r--r-- 1 lukas staff 268044 28 Apr 16:03 compact_monitor_2_1777381401816.mp4\n-rw-r--r-- 1 lukas staff 269530 28 Apr 16:08 compact_monitor_2_1777381720100.mp4\n-rw-r--r-- 1 lukas staff 268721 28 Apr 16:13 compact_monitor_2_1777382037168.mp4\n-rw-r--r-- 1 lukas staff 268583 28 Apr 16:19 compact_monitor_2_1777382355014.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 16:24 compact_monitor_2_1777382670965.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 16:29 compact_monitor_2_1777382984987.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 16:34 compact_monitor_2_1777383298084.mp4\n-rw-r--r-- 1 lukas staff 236209 28 Apr 16:40 compact_monitor_2_1777383610070.mp4\n-rw-r--r-- 1 lukas staff 1191690 28 Apr 17:01 compact_monitor_2_1777384877981.mp4\n-rw-r--r-- 1 lukas staff 2975861 28 Apr 17:06 compact_monitor_2_1777385201736.mp4\n-rw-r--r-- 1 lukas staff 5319560 28 Apr 17:12 compact_monitor_2_1777385529432.mp4\n-rw-r--r-- 1 lukas staff 3006284 28 Apr 17:18 compact_monitor_2_1777385870812.mp4\n-rw-r--r-- 1 lukas staff 2726877 28 Apr 17:23 compact_monitor_2_1777386204715.mp4\n-rw-r--r-- 1 lukas staff 3315722 28 Apr 17:29 compact_monitor_2_1777386541280.mp4\n-rw-r--r-- 1 lukas staff 1577465 28 Apr 17:34 compact_monitor_2_1777386883461.mp4\n-rw-r--r-- 1 lukas staff 1745214 28 Apr 17:40 compact_monitor_2_1777387214543.mp4\n-rw-r--r-- 1 lukas staff 950993 28 Apr 17:45 compact_monitor_2_1777387552842.mp4\n-rw-r--r-- 1 lukas staff 429007 28 Apr 17:51 compact_monitor_2_1777387889075.mp4\n-rw-r--r-- 1 lukas staff 884099 28 Apr 17:57 compact_monitor_2_1777388218623.mp4\n-rw-r--r-- 1 lukas staff 2352504 28 Apr 18:02 compact_monitor_2_1777388548021.mp4\n-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4\n-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4\n-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4\n-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4\n-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4\n-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4\n-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4\n-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4\n-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4\n-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4\n-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4\n-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4\n-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4\n-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4\n-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22523176\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 28 Apr 16:51 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite\n-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27 \n[2026-05-06 18:58:18] ========================================\n[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 18:58:18] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m04s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m06s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m07s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)\n frames (7543 rows) ⠴ % \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27\n[2026-05-06 19:22:16] ========================================\n[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 19:22:16] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m01s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m03s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ✓ 4m40s\n ocr_text (2193 rows) ✓ 0m25s\n ui_events (9909 rows) ✓ 0m02s\n elements (470235 rows) ✓ 2m46s\n meetings (3 rows) ✓ 0m00s\n\n[+08m07s] ▶ Updating FTS indexes\n elements_fts ✓ 2m59s\n frames_fts ✓ 6m07s\n ui_events_fts ✓ 0m03s\n\n[+17m16s] ▶ Verifying DB\n frames: 7543 / 7543 ✓\n elements: 470235 / 470235 ✓\n ui_events: 9909 / 9909 ✓\n ocr_text: 2193 / 2193 ✓\n meetings: 3 / 3 ✓\n\n[+18m46s] ▶ Copying data folder for 2026-04-27\n rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)\n\n[2026-05-06 19:41:28] Archive DB size: 9.7G\n[2026-05-06 19:41:28] Total time: 19m12s\n[2026-05-06 19:41:28] Sync complete for 2026-04-27\n[2026-05-06 19:41:28] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28\n[2026-05-06 19:44:49] ========================================\n[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28\n[2026-05-06 19:44:49] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (9.7G)\n Data dir: OK (223 files, 159M)\n\n[+00m00s] ▶ Counting source rows for 2026-04-28\n frames: 4535\n elements: 407532\n ui_events: 8621\n ocr_text: 1623\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m00s\n creating FTS tables ✓ 0m00s\n\n[+00m02s] ▶ Syncing data for 2026-04-28\n video_chunks ✓ 0m12s\n frames (4535 rows) ✓ 1m30s\n ocr_text (1623 rows) ✓ 0m32s\n ui_events (8621 rows) ✓ 0m01s\n elements (407532 rows) ✓ 1m02s\n meetings (3 rows) ✓ 0m00s\n\n[+03m19s] ▶ Updating FTS indexes\n elements_fts ✓ 1m36s\n frames_fts ✓ 2m28s\n ui_events_fts ✓ 0m04s\n\n[+07m27s] ▶ Verifying DB\n frames: 4535 / 4535 ✓\n elements: 407532 / 407532 ✓\n ui_events: 8621 / 8621 ✓\n ocr_text: 1623 / 1623 ✓\n meetings: 3 / 3 ✓\n\n[+08m59s] ▶ Copying data folder for 2026-04-28\n rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)\n\n[2026-05-06 19:54:08] Archive DB size: 10G\n[2026-05-06 19:54:08] Total time: 9m19s\n[2026-05-06 19:54:08] Sync complete for 2026-04-28\n[2026-05-06 19:54:08] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll\ntotal 24\ndrwx------ 9 lukas staff 288 28 Apr 09:18 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\ndrwx------ 5 lukas staff 160 1 Nov 2021 _cacache\ndrwx------@ 2 lukas staff 64 28 Apr 09:18 _locks\ndrwx------ 15 lukas staff 480 27 Apr 19:54 _logs\ndrwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx\n-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked\n-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json\n-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll \ntotal 52920\ndrwx------+ 92 lukas staff 2944 6 May 20:22 .\ndrwxr-xr-x 5 root admin 160 23 Aug 2024 ..\n-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding\n-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store\ndrwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash\ndrwx------ 5 lukas staff 160 1 Nov 2021 .aws\n-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json\n-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history\n-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc\ndrwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito\ndrwx------@ 6 lukas staff 192 9 Apr 19:53 .cache\ndrwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude\n-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json\ndrwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium\ndrwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer\ndrwx------ 16 lukas staff 512 21 May 2025 .config\ndrwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue\ndrwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot\ndrwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor\ndrwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor\ndrwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona\ndrwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb\ndrwx------ 24 lukas staff 768 27 Apr 18:14 .docker\ndrwx------ 15 lukas staff 480 6 Jun 2023 .dropbox\ndrwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak\n-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth\n-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig\n-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp\ndrwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon\ndrwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc\n-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst\ndrwx------ 5 lukas staff 160 23 Dec 2024 .local\n-rw------- 1 lukas staff 204 16 Mar 2024 .netrc\ndrwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp\n-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history\n-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer\ndrwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py\ndrwx------ 8 lukas staff 256 6 May 20:24 .npm\n-rw------- 1 lukas staff 74 20 May 2024 .npmrc\ndrwx------ 32 lukas staff 1024 25 Jul 2025 .nvm\ndrwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile\n-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history\ndrwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode\ndrwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight\ndrwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint\ndrwx------ 15 lukas staff 480 8 Aug 2025 .ssh\ndrwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit\ndrwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm\n-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\n UW PICO 5.09 New Buffer \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n [ Read 1 line ] \n^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos \n^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell \ndrwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm\ndrwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf\ndrwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn\n-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc\n-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile\n-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy\n-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave\n-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save\n-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees\n-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc\ndrwx------@ 9 lukas staff 288 20 Apr 20:55 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV\ndrwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads\ndrwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen\ndrwx------@ 112 lukas staff 3584 2 Dec 09:19 Library\ndrwx------ 7 lukas staff 224 12 Feb 2024 Movies\ndrwx------+ 5 lukas staff 160 25 Sep 2023 Music\ndrwx------+ 9 lukas staff 288 25 Sep 2023 Pictures\ndrwx------ 3 lukas staff 96 8 Nov 2021 Postman\ndrwx------+ 4 lukas staff 128 28 Oct 2021 Public\n-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf\ndrwx------ 4 lukas staff 128 2 Jul 2023 Users\n-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log\n-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 2025 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast\n-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin\n-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh\n-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe\ncd: no such file or directory: /Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated\nchecking permissions...\n screen recording: ok\n microphone: ok\n accessibility: ok\n2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap\n2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update\n2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits\n2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown\n2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export\n2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary\n2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ false │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n│ retention mode │ media-only (keep transcripts) │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ MacBook Pro Microphone (input) │\n│ │ System Audio (output) │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-05-06T20:27:34.638384Z INFO screenpipe: starting UI event capture\n2026-05-06T20:27:34.637679Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-05-06T20:27:34.649154Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(94))\n2026-05-06T20:27:34.652794Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-05-06T20:27:34.655839Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-05-06T20:27:34.673877Z INFO screenpipe_engine::ui_recorder: UI recording session started: 54869993-7b4b-491f-b717-2a583517f9c5\n2026-05-06T20:27:34.673910Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-05-06T20:27:34.674057Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-05-05 17:27:34.674056 UTC to 2026-05-06 17:27:34.674056 UTC)\n2026-05-06T20:27:34.674892Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-05-06T20:27:34.675788Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 0 frame entries, coverage from 2026-05-05 17:27:34.674056 UTC\n2026-05-06T20:27:34.686546Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-05-06T20:27:34.691371Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-05-06T20:27:36.270608Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-05-06T20:27:36.270669Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.270714Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.932583Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-05-06T20:27:36.932852Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-05-06T20:27:36.932882Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-05-06T20:27:36.932899Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-05-06T20:27:36.932901Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-05-06T20:27:39.158281Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 3 excluded)\n2026-05-06T20:27:39.593177Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1, dur=101ms\n2026-05-06T20:27:40.672366Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)\n2026-05-06T20:27:41.257664Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=2, dur=140ms\n2026-05-06T20:27:44.641022Z INFO screenpipe_audio::transcription::engine: whisper model available: \"/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin\"\n2026-05-06T20:27:44.641079Z INFO screenpipe_audio::transcription::whisper::model: whisper context: gpu acceleration enabled (Metal on macOS, Vulkan on Windows)\n2026-05-06T20:27:44.641086Z INFO screenpipe_audio::transcription::engine: loading whisper model with GPU acceleration...\nwhisper_init_from_file_with_params_no_state: loading model from '/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin'\nwhisper_init_with_params_no_state: use gpu = 1\nwhisper_init_with_params_no_state: flash attn = 0\nwhisper_init_with_params_no_state: gpu_device = 0\nwhisper_init_with_params_no_state: dtw = 0\nggml_metal_device_init: tensor API disabled for pre-M5 and pre-A19 devices\nggml_metal_library_init: using embedded metal library\nggml_metal_library_init: loaded in 0.041 sec\nggml_metal_rsets_init: creating a residency set collection (keep_alive = 180 s)\nggml_metal_device_init: GPU name: Apple M1\nggml_metal_device_init: GPU family: MTLGPUFamilyApple7 (1007)\nggml_metal_device_init: GPU family: MTLGPUFamilyCommon3 (3003)\nggml_metal_device_init: GPU family: MTLGPUFamilyMetal3 (5001)\nggml_metal_device_init: simdgroup reduction = true\nggml_metal_device_init: simdgroup matrix mul. = true\nggml_metal_device_init: has unified memory = true\nggml_metal_device_init: has bfloat = true\nggml_metal_device_init: has tensor = false\nggml_metal_device_init: use residency sets = true\nggml_metal_device_init: use shared buffers = true\nggml_metal_device_init: recommendedMaxWorkingSetSize = 11453.25 MB\nwhisper_init_with_params_no_state: devices = 3\nwhisper_init_with_params_no_state: backends = 3\nwhisper_model_load: loading model\nwhisper_model_load: n_vocab = 51865\nwhisper_model_load: n_audio_ctx = 1500\nwhisper_model_load: n_audio_state = 384\nwhisper_model_load: n_audio_head = 6\nwhisper_model_load: n_audio_layer = 4\nwhisper_model_load: n_text_ctx = 448\nwhisper_model_load: n_text_state = 384\nwhisper_model_load: n_text_head = 6\nwhisper_model_load: n_text_layer = 4\nwhisper_model_load: n_mels = 80\nwhisper_model_load: ftype = 1\nwhisper_model_load: qntvr = 0\nwhisper_model_load: type = 1 (tiny)\nwhisper_model_load: adding 1608 extra tokens\nwhisper_model_load: n_langs = 99\nwhisper_model_load: Metal total size = 77.11 MB\nwhisper_model_load: model size = 77.11 MB\n2026-05-06T20:27:44.857210Z INFO screenpipe_audio::transcription::engine: whisper model loaded successfully\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\n2026-05-06T20:27:44.861912Z INFO screenpipe_audio::audio_manager::manager: transcription session created (will be reused across segments)\n2026-05-06T20:27:44.862480Z INFO screenpipe_audio::audio_manager::manager: audio manager started\n2026-05-06T20:27:44.862525Z INFO screenpipe_audio::audio_manager::manager: calendar-assisted speaker diarization: listening for meeting events","is_focused":true},{"role":"AXTextField","text":"you","depth":3,"bounds":{"left":0.7888889,"top":0.10555556,"width":0.13055556,"height":0.024444444},"on_screen":true,"automation_id":"_NS:65","value":"you","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.7902778,"top":0.10555556,"width":0.017361112,"height":0.024444444},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.9013889,"top":0.10555556,"width":0.015277778,"height":0.024444444},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.925,"top":0.10666667,"width":0.014583333,"height":0.023333333},"on_screen":true,"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.93958336,"top":0.10666667,"width":0.014583333,"height":0.023333333},"on_screen":true,"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.47083333,"top":0.033333335,"width":0.058333334,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
7244240707978763719
|
5579017683957890129
|
visual_change
|
accessibility
|
NULL
|
-rw-r--r-- 1 lukas staff 397068 28 Apr 17:01 -rw-r--r-- 1 lukas staff 397068 28 Apr 17:01 compact_monitor_1_1777384874970.mp4
-rw-r--r-- 1 lukas staff 1592462 28 Apr 17:06 compact_monitor_1_1777385198571.mp4
-rw-r--r-- 1 lukas staff 1327809 28 Apr 17:12 compact_monitor_1_1777385523980.mp4
-rw-r--r-- 1 lukas staff 2262498 28 Apr 17:17 compact_monitor_1_1777385864559.mp4
-rw-r--r-- 1 lukas staff 1702453 28 Apr 17:23 compact_monitor_1_1777386198870.mp4
-rw-r--r-- 1 lukas staff 2034287 28 Apr 17:29 compact_monitor_1_1777386532344.mp4
-rw-r--r-- 1 lukas staff 1352893 28 Apr 17:34 compact_monitor_1_1777386875277.mp4
-rw-r--r-- 1 lukas staff 1873946 28 Apr 17:40 compact_monitor_1_1777387208685.mp4
-rw-r--r-- 1 lukas staff 1155463 28 Apr 17:45 compact_monitor_1_1777387548798.mp4
-rw-r--r-- 1 lukas staff 1428159 28 Apr 17:51 compact_monitor_1_1777387882691.mp4
-rw-r--r-- 1 lukas staff 1398484 28 Apr 17:56 compact_monitor_1_1777388213861.mp4
-rw-r--r-- 1 lukas staff 1688438 28 Apr 18:02 compact_monitor_1_1777388542869.mp4
-rw-r--r-- 1 lukas staff 2401161 28 Apr 18:07 compact_monitor_1_1777388869470.mp4
-rw-r--r-- 1 lukas staff 1283247 28 Apr 18:13 compact_monitor_1_1777389192202.mp4
-rw-r--r-- 1 lukas staff 1398160 28 Apr 18:18 compact_monitor_1_1777389525394.mp4
-rw-r--r-- 1 lukas staff 452906 28 Apr 18:24 compact_monitor_1_1777389856559.mp4
-rw-r--r-- 1 lukas staff 566518 28 Apr 18:29 compact_monitor_1_1777390191054.mp4
-rw-r--r-- 1 lukas staff 445894 28 Apr 18:35 compact_monitor_1_1777390513567.mp4
-rw-r--r-- 1 lukas staff 444044 28 Apr 18:40 compact_monitor_1_1777390841877.mp4
-rw-r--r-- 1 lukas staff 437853 28 Apr 18:46 compact_monitor_1_1777391162552.mp4
-rw-r--r-- 1 lukas staff 441008 28 Apr 18:51 compact_monitor_1_1777391489107.mp4
-rw-r--r-- 1 lukas staff 443934 28 Apr 18:57 compact_monitor_1_1777391823165.mp4
-rw-r--r-- 1 lukas staff 443624 28 Apr 19:02 compact_monitor_1_1777392146221.mp4
-rw-r--r-- 1 lukas staff 447164 28 Apr 19:07 compact_monitor_1_1777392469679.mp4
-rw-r--r-- 1 lukas staff 442431 28 Apr 19:13 compact_monitor_1_1777392792794.mp4
-rw-r--r-- 1 lukas staff 436805 28 Apr 19:18 compact_monitor_1_1777393109301.mp4
-rw-r--r-- 1 lukas staff 435633 28 Apr 19:23 compact_monitor_1_1777393423192.mp4
-rw-r--r-- 1 lukas staff 1162510 28 Apr 09:30 compact_monitor_2_1777357806702.mp4
-rw-r--r-- 1 lukas staff 3394878 28 Apr 09:35 compact_monitor_2_1777358126186.mp4
-rw-r--r-- 1 lukas staff 268044 28 Apr 09:40 compact_monitor_2_1777358443280.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 09:46 compact_monitor_2_1777358769231.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 09:51 compact_monitor_2_1777359084493.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 09:56 compact_monitor_2_1777359399758.mp4
-rw-r--r-- 1 lukas staff 266694 28 Apr 10:01 compact_monitor_2_1777359707884.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 10:06 compact_monitor_2_1777360016892.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 10:12 compact_monitor_2_1777360329199.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 10:17 compact_monitor_2_1777360641498.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 10:22 compact_monitor_2_1777360953971.mp4
-rw-r--r-- 1 lukas staff 267099 28 Apr 10:27 compact_monitor_2_1777361264266.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 10:33 compact_monitor_2_1777361583211.mp4
-rw-r--r-- 1 lukas staff 266829 28 Apr 10:38 compact_monitor_2_1777361903545.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 10:43 compact_monitor_2_1777362219032.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 10:48 compact_monitor_2_1777362532674.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 10:54 compact_monitor_2_1777362845950.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 10:59 compact_monitor_2_1777363157577.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 11:04 compact_monitor_2_1777363473776.mp4
-rw-r--r-- 1 lukas staff 267099 28 Apr 11:09 compact_monitor_2_1777363782342.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 11:14 compact_monitor_2_1777364092822.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 11:20 compact_monitor_2_1777364400840.mp4
-rw-r--r-- 1 lukas staff 266694 28 Apr 11:25 compact_monitor_2_1777364709144.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 11:30 compact_monitor_2_1777365022090.mp4
-rw-r--r-- 1 lukas staff 264669 28 Apr 11:35 compact_monitor_2_1777365335928.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 11:40 compact_monitor_2_1777365649137.mp4
-rw-r--r-- 1 lukas staff 266964 28 Apr 11:46 compact_monitor_2_1777365962619.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 11:51 compact_monitor_2_1777366273740.mp4
-rw-r--r-- 1 lukas staff 265209 28 Apr 11:56 compact_monitor_2_1777366582034.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 12:01 compact_monitor_2_1777366886631.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 12:06 compact_monitor_2_1777367202805.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 12:11 compact_monitor_2_1777367518861.mp4
-rw-r--r-- 1 lukas staff 269261 28 Apr 12:17 compact_monitor_2_1777367837441.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 12:22 compact_monitor_2_1777368160952.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 12:28 compact_monitor_2_1777368477571.mp4
-rw-r--r-- 1 lukas staff 267234 28 Apr 12:33 compact_monitor_2_1777368792600.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 12:38 compact_monitor_2_1777369107069.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 12:43 compact_monitor_2_1777369421530.mp4
-rw-r--r-- 1 lukas staff 266829 28 Apr 12:48 compact_monitor_2_1777369731189.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 12:54 compact_monitor_2_1777370048214.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 12:59 compact_monitor_2_1777370363567.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 13:04 compact_monitor_2_1777370679314.mp4
-rw-r--r-- 1 lukas staff 268855 28 Apr 13:09 compact_monitor_2_1777370994284.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 13:15 compact_monitor_2_1777371309064.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 13:20 compact_monitor_2_1777371623643.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 13:25 compact_monitor_2_1777371938006.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 13:30 compact_monitor_2_1777372252120.mp4
-rw-r--r-- 1 lukas staff 266964 28 Apr 13:36 compact_monitor_2_1777372566394.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 13:41 compact_monitor_2_1777372880197.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 13:46 compact_monitor_2_1777373193667.mp4
-rw-r--r-- 1 lukas staff 265209 28 Apr 13:51 compact_monitor_2_1777373506832.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 13:56 compact_monitor_2_1777373816197.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 14:02 compact_monitor_2_1777374130774.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 14:07 compact_monitor_2_1777374443527.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 14:12 compact_monitor_2_1777374756405.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 14:17 compact_monitor_2_1777375070551.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 14:23 compact_monitor_2_1777375397987.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 14:28 compact_monitor_2_1777375715930.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 14:33 compact_monitor_2_1777376034152.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 14:39 compact_monitor_2_1777376348246.mp4
-rw-r--r-- 1 lukas staff 266019 28 Apr 14:44 compact_monitor_2_1777376657026.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 14:49 compact_monitor_2_1777376966683.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 14:54 compact_monitor_2_1777377280571.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:00 compact_monitor_2_1777377602616.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:05 compact_monitor_2_1777377915467.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 15:10 compact_monitor_2_1777378232424.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 15:15 compact_monitor_2_1777378547117.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:21 compact_monitor_2_1777378865359.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 15:26 compact_monitor_2_1777379183376.mp4
-rw-r--r-- 1 lukas staff 267774 28 Apr 15:31 compact_monitor_2_1777379502714.mp4
-rw-r--r-- 1 lukas staff 268046 28 Apr 15:37 compact_monitor_2_1777379819259.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 15:42 compact_monitor_2_1777380134674.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 15:47 compact_monitor_2_1777380454708.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 15:52 compact_monitor_2_1777380771150.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 15:58 compact_monitor_2_1777381086934.mp4
-rw-r--r-- 1 lukas staff 268044 28 Apr 16:03 compact_monitor_2_1777381401816.mp4
-rw-r--r-- 1 lukas staff 269530 28 Apr 16:08 compact_monitor_2_1777381720100.mp4
-rw-r--r-- 1 lukas staff 268721 28 Apr 16:13 compact_monitor_2_1777382037168.mp4
-rw-r--r-- 1 lukas staff 268583 28 Apr 16:19 compact_monitor_2_1777382355014.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 16:24 compact_monitor_2_1777382670965.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 16:29 compact_monitor_2_1777382984987.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 16:34 compact_monitor_2_1777383298084.mp4
-rw-r--r-- 1 lukas staff 236209 28 Apr 16:40 compact_monitor_2_1777383610070.mp4
-rw-r--r-- 1 lukas staff 1191690 28 Apr 17:01 compact_monitor_2_1777384877981.mp4
-rw-r--r-- 1 lukas staff 2975861 28 Apr 17:06 compact_monitor_2_1777385201736.mp4
-rw-r--r-- 1 lukas staff 5319560 28 Apr 17:12 compact_monitor_2_1777385529432.mp4
-rw-r--r-- 1 lukas staff 3006284 28 Apr 17:18 compact_monitor_2_1777385870812.mp4
-rw-r--r-- 1 lukas staff 2726877 28 Apr 17:23 compact_monitor_2_1777386204715.mp4
-rw-r--r-- 1 lukas staff 3315722 28 Apr 17:29 compact_monitor_2_1777386541280.mp4
-rw-r--r-- 1 lukas staff 1577465 28 Apr 17:34 compact_monitor_2_1777386883461.mp4
-rw-r--r-- 1 lukas staff 1745214 28 Apr 17:40 compact_monitor_2_1777387214543.mp4
-rw-r--r-- 1 lukas staff 950993 28 Apr 17:45 compact_monitor_2_1777387552842.mp4
-rw-r--r-- 1 lukas staff 429007 28 Apr 17:51 compact_monitor_2_1777387889075.mp4
-rw-r--r-- 1 lukas staff 884099 28 Apr 17:57 compact_monitor_2_1777388218623.mp4
-rw-r--r-- 1 lukas staff 2352504 28 Apr 18:02 compact_monitor_2_1777388548021.mp4
-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4
-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4
-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4
-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4
-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4
-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4
-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4
-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4
-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4
-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4
-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4
-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4
-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4
-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4
-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22523176
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 28 Apr 16:51 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite
-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm
-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 18:58:18] ========================================
[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27
[2026-05-06 18:58:18] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m04s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m06s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m07s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)
frames (7543 rows) ⠴ %
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 19:22:16] ========================================
[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27
[2026-05-06 19:22:16] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m01s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m03s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ✓ 4m40s
ocr_text (2193 rows) ✓ 0m25s
ui_events (9909 rows) ✓ 0m02s
elements (470235 rows) ✓ 2m46s
meetings (3 rows) ✓ 0m00s
[+08m07s] ▶ Updating FTS indexes
elements_fts ✓ 2m59s
frames_fts ✓ 6m07s
ui_events_fts ✓ 0m03s
[+17m16s] ▶ Verifying DB
frames: 7543 / 7543 ✓
elements: 470235 / 470235 ✓
ui_events: 9909 / 9909 ✓
ocr_text: 2193 / 2193 ✓
meetings: 3 / 3 ✓
[+18m46s] ▶ Copying data folder for 2026-04-27
rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)
[2026-05-06 19:41:28] Archive DB size: 9.7G
[2026-05-06 19:41:28] Total time: 19m12s
[2026-05-06 19:41:28] Sync complete for 2026-04-27
[2026-05-06 19:41:28] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28
[2026-05-06 19:44:49] ========================================
[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28
[2026-05-06 19:44:49] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (9.7G)
Data dir: OK (223 files, 159M)
[+00m00s] ▶ Counting source rows for 2026-04-28
frames: 4535
elements: 407532
ui_events: 8621
ocr_text: 1623
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m00s
creating FTS tables ✓ 0m00s
[+00m02s] ▶ Syncing data for 2026-04-28
video_chunks ✓ 0m12s
frames (4535 rows) ✓ 1m30s
ocr_text (1623 rows) ✓ 0m32s
ui_events (8621 rows) ✓ 0m01s
elements (407532 rows) ✓ 1m02s
meetings (3 rows) ✓ 0m00s
[+03m19s] ▶ Updating FTS indexes
elements_fts ✓ 1m36s
frames_fts ✓ 2m28s
ui_events_fts ✓ 0m04s
[+07m27s] ▶ Verifying DB
frames: 4535 / 4535 ✓
elements: 407532 / 407532 ✓
ui_events: 8621 / 8621 ✓
ocr_text: 1623 / 1623 ✓
meetings: 3 / 3 ✓
[+08m59s] ▶ Copying data folder for 2026-04-28
rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)
[2026-05-06 19:54:08] Archive DB size: 10G
[2026-05-06 19:54:08] Total time: 9m19s
[2026-05-06 19:54:08] Sync complete for 2026-04-28
[2026-05-06 19:54:08] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll
total 24
drwx------ 9 lukas staff 288 28 Apr 09:18 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
drwx------ 5 lukas staff 160 1 Nov 2021 _cacache
drwx------@ 2 lukas staff 64 28 Apr 09:18 _locks
drwx------ 15 lukas staff 480 27 Apr 19:54 _logs
drwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx
-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked
-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json
-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 52920
drwx------+ 92 lukas staff 2944 6 May 20:22 .
drwxr-xr-x 5 root admin 160 23 Aug 2024 ..
-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding
-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store
drwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash
drwx------ 5 lukas staff 160 1 Nov 2021 .aws
-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json
-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history
-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc
drwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito
drwx------@ 6 lukas staff 192 9 Apr 19:53 .cache
drwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude
-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json
drwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium
drwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer
drwx------ 16 lukas staff 512 21 May 2025 .config
drwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue
drwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot
drwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor
drwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor
drwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona
drwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb
drwx------ 24 lukas staff 768 27 Apr 18:14 .docker
drwx------ 15 lukas staff 480 6 Jun 2023 .dropbox
drwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak
-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth
-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig
-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp
drwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon
drwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc
-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst
drwx------ 5 lukas staff 160 23 Dec 2024 .local
-rw------- 1 lukas staff 204 16 Mar 2024 .netrc
drwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp
-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history
-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer
drwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py
drwx------ 8 lukas staff 256 6 May 20:24 .npm
-rw------- 1 lukas staff 74 20 May 2024 .npmrc
drwx------ 32 lukas staff 1024 25 Jul 2025 .nvm
drwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile
-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history
drwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode
drwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight
drwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint
drwx------ 15 lukas staff 480 8 Aug 2025 .ssh
drwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit
drwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm
-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
UW PICO 5.09 New Buffer
[ Read 1 line ]
^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos
^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell
drwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm
drwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf
drwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn
-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc
-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile
-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy
-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave
-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save
-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees
-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc
drwx------@ 9 lukas staff 288 20 Apr 20:55 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV
drwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads
drwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen
drwx------@ 112 lukas staff 3584 2 Dec 09:19 Library
drwx------ 7 lukas staff 224 12 Feb 2024 Movies
drwx------+ 5 lukas staff 160 25 Sep 2023 Music
drwx------+ 9 lukas staff 288 25 Sep 2023 Pictures
drwx------ 3 lukas staff 96 8 Nov 2021 Postman
drwx------+ 4 lukas staff 128 28 Oct 2021 Public
-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf
drwx------ 4 lukas staff 128 2 Jul 2023 Users
-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log
-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log
-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4
-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 2025 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast
-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin
-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh
-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
cd: no such file or directory: /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated
checking permissions...
screen recording: ok
microphone: ok
accessibility: ok
2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap
2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update
2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits
2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown
2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export
2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary
2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ false │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 7 │
│ retention mode │ media-only (keep transcripts) │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ MacBook Pro Microphone (input) │
│ │ System Audio (output) │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your d...
|
1
|
NULL
|
|
4
|
1
|
2
|
2026-05-06T17:27:58.583455+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778088478583_m1.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
-rw-r--r-- 1 lukas staff 1702453 28 Apr 17:23 -rw-r--r-- 1 lukas staff 1702453 28 Apr 17:23 compact_monitor_1_1777386198870.mp4
-rw-r--r-- 1 lukas staff 2034287 28 Apr 17:29 compact_monitor_1_1777386532344.mp4
-rw-r--r-- 1 lukas staff 1352893 28 Apr 17:34 compact_monitor_1_1777386875277.mp4
-rw-r--r-- 1 lukas staff 1873946 28 Apr 17:40 compact_monitor_1_1777387208685.mp4
-rw-r--r-- 1 lukas staff 1155463 28 Apr 17:45 compact_monitor_1_1777387548798.mp4
-rw-r--r-- 1 lukas staff 1428159 28 Apr 17:51 compact_monitor_1_1777387882691.mp4
-rw-r--r-- 1 lukas staff 1398484 28 Apr 17:56 compact_monitor_1_1777388213861.mp4
-rw-r--r-- 1 lukas staff 1688438 28 Apr 18:02 compact_monitor_1_1777388542869.mp4
-rw-r--r-- 1 lukas staff 2401161 28 Apr 18:07 compact_monitor_1_1777388869470.mp4
-rw-r--r-- 1 lukas staff 1283247 28 Apr 18:13 compact_monitor_1_1777389192202.mp4
-rw-r--r-- 1 lukas staff 1398160 28 Apr 18:18 compact_monitor_1_1777389525394.mp4
-rw-r--r-- 1 lukas staff 452906 28 Apr 18:24 compact_monitor_1_1777389856559.mp4
-rw-r--r-- 1 lukas staff 566518 28 Apr 18:29 compact_monitor_1_1777390191054.mp4
-rw-r--r-- 1 lukas staff 445894 28 Apr 18:35 compact_monitor_1_1777390513567.mp4
-rw-r--r-- 1 lukas staff 444044 28 Apr 18:40 compact_monitor_1_1777390841877.mp4
-rw-r--r-- 1 lukas staff 437853 28 Apr 18:46 compact_monitor_1_1777391162552.mp4
-rw-r--r-- 1 lukas staff 441008 28 Apr 18:51 compact_monitor_1_1777391489107.mp4
-rw-r--r-- 1 lukas staff 443934 28 Apr 18:57 compact_monitor_1_1777391823165.mp4
-rw-r--r-- 1 lukas staff 443624 28 Apr 19:02 compact_monitor_1_1777392146221.mp4
-rw-r--r-- 1 lukas staff 447164 28 Apr 19:07 compact_monitor_1_1777392469679.mp4
-rw-r--r-- 1 lukas staff 442431 28 Apr 19:13 compact_monitor_1_1777392792794.mp4
-rw-r--r-- 1 lukas staff 436805 28 Apr 19:18 compact_monitor_1_1777393109301.mp4
-rw-r--r-- 1 lukas staff 435633 28 Apr 19:23 compact_monitor_1_1777393423192.mp4
-rw-r--r-- 1 lukas staff 1162510 28 Apr 09:30 compact_monitor_2_1777357806702.mp4
-rw-r--r-- 1 lukas staff 3394878 28 Apr 09:35 compact_monitor_2_1777358126186.mp4
-rw-r--r-- 1 lukas staff 268044 28 Apr 09:40 compact_monitor_2_1777358443280.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 09:46 compact_monitor_2_1777358769231.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 09:51 compact_monitor_2_1777359084493.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 09:56 compact_monitor_2_1777359399758.mp4
-rw-r--r-- 1 lukas staff 266694 28 Apr 10:01 compact_monitor_2_1777359707884.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 10:06 compact_monitor_2_1777360016892.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 10:12 compact_monitor_2_1777360329199.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 10:17 compact_monitor_2_1777360641498.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 10:22 compact_monitor_2_1777360953971.mp4
-rw-r--r-- 1 lukas staff 267099 28 Apr 10:27 compact_monitor_2_1777361264266.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 10:33 compact_monitor_2_1777361583211.mp4
-rw-r--r-- 1 lukas staff 266829 28 Apr 10:38 compact_monitor_2_1777361903545.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 10:43 compact_monitor_2_1777362219032.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 10:48 compact_monitor_2_1777362532674.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 10:54 compact_monitor_2_1777362845950.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 10:59 compact_monitor_2_1777363157577.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 11:04 compact_monitor_2_1777363473776.mp4
-rw-r--r-- 1 lukas staff 267099 28 Apr 11:09 compact_monitor_2_1777363782342.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 11:14 compact_monitor_2_1777364092822.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 11:20 compact_monitor_2_1777364400840.mp4
-rw-r--r-- 1 lukas staff 266694 28 Apr 11:25 compact_monitor_2_1777364709144.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 11:30 compact_monitor_2_1777365022090.mp4
-rw-r--r-- 1 lukas staff 264669 28 Apr 11:35 compact_monitor_2_1777365335928.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 11:40 compact_monitor_2_1777365649137.mp4
-rw-r--r-- 1 lukas staff 266964 28 Apr 11:46 compact_monitor_2_1777365962619.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 11:51 compact_monitor_2_1777366273740.mp4
-rw-r--r-- 1 lukas staff 265209 28 Apr 11:56 compact_monitor_2_1777366582034.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 12:01 compact_monitor_2_1777366886631.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 12:06 compact_monitor_2_1777367202805.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 12:11 compact_monitor_2_1777367518861.mp4
-rw-r--r-- 1 lukas staff 269261 28 Apr 12:17 compact_monitor_2_1777367837441.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 12:22 compact_monitor_2_1777368160952.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 12:28 compact_monitor_2_1777368477571.mp4
-rw-r--r-- 1 lukas staff 267234 28 Apr 12:33 compact_monitor_2_1777368792600.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 12:38 compact_monitor_2_1777369107069.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 12:43 compact_monitor_2_1777369421530.mp4
-rw-r--r-- 1 lukas staff 266829 28 Apr 12:48 compact_monitor_2_1777369731189.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 12:54 compact_monitor_2_1777370048214.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 12:59 compact_monitor_2_1777370363567.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 13:04 compact_monitor_2_1777370679314.mp4
-rw-r--r-- 1 lukas staff 268855 28 Apr 13:09 compact_monitor_2_1777370994284.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 13:15 compact_monitor_2_1777371309064.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 13:20 compact_monitor_2_1777371623643.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 13:25 compact_monitor_2_1777371938006.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 13:30 compact_monitor_2_1777372252120.mp4
-rw-r--r-- 1 lukas staff 266964 28 Apr 13:36 compact_monitor_2_1777372566394.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 13:41 compact_monitor_2_1777372880197.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 13:46 compact_monitor_2_1777373193667.mp4
-rw-r--r-- 1 lukas staff 265209 28 Apr 13:51 compact_monitor_2_1777373506832.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 13:56 compact_monitor_2_1777373816197.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 14:02 compact_monitor_2_1777374130774.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 14:07 compact_monitor_2_1777374443527.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 14:12 compact_monitor_2_1777374756405.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 14:17 compact_monitor_2_1777375070551.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 14:23 compact_monitor_2_1777375397987.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 14:28 compact_monitor_2_1777375715930.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 14:33 compact_monitor_2_1777376034152.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 14:39 compact_monitor_2_1777376348246.mp4
-rw-r--r-- 1 lukas staff 266019 28 Apr 14:44 compact_monitor_2_1777376657026.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 14:49 compact_monitor_2_1777376966683.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 14:54 compact_monitor_2_1777377280571.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:00 compact_monitor_2_1777377602616.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:05 compact_monitor_2_1777377915467.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 15:10 compact_monitor_2_1777378232424.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 15:15 compact_monitor_2_1777378547117.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:21 compact_monitor_2_1777378865359.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 15:26 compact_monitor_2_1777379183376.mp4
-rw-r--r-- 1 lukas staff 267774 28 Apr 15:31 compact_monitor_2_1777379502714.mp4
-rw-r--r-- 1 lukas staff 268046 28 Apr 15:37 compact_monitor_2_1777379819259.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 15:42 compact_monitor_2_1777380134674.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 15:47 compact_monitor_2_1777380454708.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 15:52 compact_monitor_2_1777380771150.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 15:58 compact_monitor_2_1777381086934.mp4
-rw-r--r-- 1 lukas staff 268044 28 Apr 16:03 compact_monitor_2_1777381401816.mp4
-rw-r--r-- 1 lukas staff 269530 28 Apr 16:08 compact_monitor_2_1777381720100.mp4
-rw-r--r-- 1 lukas staff 268721 28 Apr 16:13 compact_monitor_2_1777382037168.mp4
-rw-r--r-- 1 lukas staff 268583 28 Apr 16:19 compact_monitor_2_1777382355014.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 16:24 compact_monitor_2_1777382670965.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 16:29 compact_monitor_2_1777382984987.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 16:34 compact_monitor_2_1777383298084.mp4
-rw-r--r-- 1 lukas staff 236209 28 Apr 16:40 compact_monitor_2_1777383610070.mp4
-rw-r--r-- 1 lukas staff 1191690 28 Apr 17:01 compact_monitor_2_1777384877981.mp4
-rw-r--r-- 1 lukas staff 2975861 28 Apr 17:06 compact_monitor_2_1777385201736.mp4
-rw-r--r-- 1 lukas staff 5319560 28 Apr 17:12 compact_monitor_2_1777385529432.mp4
-rw-r--r-- 1 lukas staff 3006284 28 Apr 17:18 compact_monitor_2_1777385870812.mp4
-rw-r--r-- 1 lukas staff 2726877 28 Apr 17:23 compact_monitor_2_1777386204715.mp4
-rw-r--r-- 1 lukas staff 3315722 28 Apr 17:29 compact_monitor_2_1777386541280.mp4
-rw-r--r-- 1 lukas staff 1577465 28 Apr 17:34 compact_monitor_2_1777386883461.mp4
-rw-r--r-- 1 lukas staff 1745214 28 Apr 17:40 compact_monitor_2_1777387214543.mp4
-rw-r--r-- 1 lukas staff 950993 28 Apr 17:45 compact_monitor_2_1777387552842.mp4
-rw-r--r-- 1 lukas staff 429007 28 Apr 17:51 compact_monitor_2_1777387889075.mp4
-rw-r--r-- 1 lukas staff 884099 28 Apr 17:57 compact_monitor_2_1777388218623.mp4
-rw-r--r-- 1 lukas staff 2352504 28 Apr 18:02 compact_monitor_2_1777388548021.mp4
-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4
-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4
-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4
-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4
-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4
-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4
-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4
-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4
-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4
-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4
-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4
-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4
-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4
-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4
-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22523176
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 28 Apr 16:51 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite
-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm
-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 18:58:18] ========================================
[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27
[2026-05-06 18:58:18] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m04s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m06s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m07s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)
frames (7543 rows) ⠴ %
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 19:22:16] ========================================
[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27
[2026-05-06 19:22:16] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m01s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m03s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ✓ 4m40s
ocr_text (2193 rows) ✓ 0m25s
ui_events (9909 rows) ✓ 0m02s
elements (470235 rows) ✓ 2m46s
meetings (3 rows) ✓ 0m00s
[+08m07s] ▶ Updating FTS indexes
elements_fts ✓ 2m59s
frames_fts ✓ 6m07s
ui_events_fts ✓ 0m03s
[+17m16s] ▶ Verifying DB
frames: 7543 / 7543 ✓
elements: 470235 / 470235 ✓
ui_events: 9909 / 9909 ✓
ocr_text: 2193 / 2193 ✓
meetings: 3 / 3 ✓
[+18m46s] ▶ Copying data folder for 2026-04-27
rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)
[2026-05-06 19:41:28] Archive DB size: 9.7G
[2026-05-06 19:41:28] Total time: 19m12s
[2026-05-06 19:41:28] Sync complete for 2026-04-27
[2026-05-06 19:41:28] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28
[2026-05-06 19:44:49] ========================================
[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28
[2026-05-06 19:44:49] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (9.7G)
Data dir: OK (223 files, 159M)
[+00m00s] ▶ Counting source rows for 2026-04-28
frames: 4535
elements: 407532
ui_events: 8621
ocr_text: 1623
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m00s
creating FTS tables ✓ 0m00s
[+00m02s] ▶ Syncing data for 2026-04-28
video_chunks ✓ 0m12s
frames (4535 rows) ✓ 1m30s
ocr_text (1623 rows) ✓ 0m32s
ui_events (8621 rows) ✓ 0m01s
elements (407532 rows) ✓ 1m02s
meetings (3 rows) ✓ 0m00s
[+03m19s] ▶ Updating FTS indexes
elements_fts ✓ 1m36s
frames_fts ✓ 2m28s
ui_events_fts ✓ 0m04s
[+07m27s] ▶ Verifying DB
frames: 4535 / 4535 ✓
elements: 407532 / 407532 ✓
ui_events: 8621 / 8621 ✓
ocr_text: 1623 / 1623 ✓
meetings: 3 / 3 ✓
[+08m59s] ▶ Copying data folder for 2026-04-28
rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)
[2026-05-06 19:54:08] Archive DB size: 10G
[2026-05-06 19:54:08] Total time: 9m19s
[2026-05-06 19:54:08] Sync complete for 2026-04-28
[2026-05-06 19:54:08] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll
total 24
drwx------ 9 lukas staff 288 28 Apr 09:18 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
drwx------ 5 lukas staff 160 1 Nov 2021 _cacache
drwx------@ 2 lukas staff 64 28 Apr 09:18 _locks
drwx------ 15 lukas staff 480 27 Apr 19:54 _logs
drwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx
-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked
-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json
-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 52920
drwx------+ 92 lukas staff 2944 6 May 20:22 .
drwxr-xr-x 5 root admin 160 23 Aug 2024 ..
-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding
-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store
drwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash
drwx------ 5 lukas staff 160 1 Nov 2021 .aws
-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json
-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history
-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc
drwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito
drwx------@ 6 lukas staff 192 9 Apr 19:53 .cache
drwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude
-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json
drwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium
drwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer
drwx------ 16 lukas staff 512 21 May 2025 .config
drwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue
drwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot
drwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor
drwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor
drwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona
drwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb
drwx------ 24 lukas staff 768 27 Apr 18:14 .docker
drwx------ 15 lukas staff 480 6 Jun 2023 .dropbox
drwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak
-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth
-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig
-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp
drwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon
drwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc
-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst
drwx------ 5 lukas staff 160 23 Dec 2024 .local
-rw------- 1 lukas staff 204 16 Mar 2024 .netrc
drwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp
-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history
-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer
drwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py
drwx------ 8 lukas staff 256 6 May 20:24 .npm
-rw------- 1 lukas staff 74 20 May 2024 .npmrc
drwx------ 32 lukas staff 1024 25 Jul 2025 .nvm
drwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile
-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history
drwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode
drwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight
drwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint
drwx------ 15 lukas staff 480 8 Aug 2025 .ssh
drwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit
drwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm
-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
UW PICO 5.09 New Buffer
[ Read 1 line ]
^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos
^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell
drwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm
drwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf
drwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn
-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc
-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile
-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy
-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave
-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save
-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees
-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc
drwx------@ 9 lukas staff 288 20 Apr 20:55 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV
drwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads
drwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen
drwx------@ 112 lukas staff 3584 2 Dec 09:19 Library
drwx------ 7 lukas staff 224 12 Feb 2024 Movies
drwx------+ 5 lukas staff 160 25 Sep 2023 Music
drwx------+ 9 lukas staff 288 25 Sep 2023 Pictures
drwx------ 3 lukas staff 96 8 Nov 2021 Postman
drwx------+ 4 lukas staff 128 28 Oct 2021 Public
-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf
drwx------ 4 lukas staff 128 2 Jul 2023 Users
-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log
-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log
-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4
-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 2025 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast
-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin
-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh
-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
cd: no such file or directory: /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated
checking permissions...
screen recording: ok
microphone: ok
accessibility: ok
2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap
2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update
2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits
2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown
2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export
2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary
2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ false │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 7 │
│ retention mode │ media-only (keep transcripts) │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ MacBook Pro Microphone (input) │
│ │ System Audio (output) │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: https://github.com/screenpipe/screenpipe/releases
2026-05-06T20:27:34.638384Z INFO screenpipe: starting UI event capture
2026-05-06T20:27:34.637679Z INFO screenpipe_core::pipes...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"-rw-r--r-- 1 lukas staff 1702453 28 Apr 17:23 compact_monitor_1_1777386198870.mp4\n-rw-r--r-- 1 lukas staff 2034287 28 Apr 17:29 compact_monitor_1_1777386532344.mp4\n-rw-r--r-- 1 lukas staff 1352893 28 Apr 17:34 compact_monitor_1_1777386875277.mp4\n-rw-r--r-- 1 lukas staff 1873946 28 Apr 17:40 compact_monitor_1_1777387208685.mp4\n-rw-r--r-- 1 lukas staff 1155463 28 Apr 17:45 compact_monitor_1_1777387548798.mp4\n-rw-r--r-- 1 lukas staff 1428159 28 Apr 17:51 compact_monitor_1_1777387882691.mp4\n-rw-r--r-- 1 lukas staff 1398484 28 Apr 17:56 compact_monitor_1_1777388213861.mp4\n-rw-r--r-- 1 lukas staff 1688438 28 Apr 18:02 compact_monitor_1_1777388542869.mp4\n-rw-r--r-- 1 lukas staff 2401161 28 Apr 18:07 compact_monitor_1_1777388869470.mp4\n-rw-r--r-- 1 lukas staff 1283247 28 Apr 18:13 compact_monitor_1_1777389192202.mp4\n-rw-r--r-- 1 lukas staff 1398160 28 Apr 18:18 compact_monitor_1_1777389525394.mp4\n-rw-r--r-- 1 lukas staff 452906 28 Apr 18:24 compact_monitor_1_1777389856559.mp4\n-rw-r--r-- 1 lukas staff 566518 28 Apr 18:29 compact_monitor_1_1777390191054.mp4\n-rw-r--r-- 1 lukas staff 445894 28 Apr 18:35 compact_monitor_1_1777390513567.mp4\n-rw-r--r-- 1 lukas staff 444044 28 Apr 18:40 compact_monitor_1_1777390841877.mp4\n-rw-r--r-- 1 lukas staff 437853 28 Apr 18:46 compact_monitor_1_1777391162552.mp4\n-rw-r--r-- 1 lukas staff 441008 28 Apr 18:51 compact_monitor_1_1777391489107.mp4\n-rw-r--r-- 1 lukas staff 443934 28 Apr 18:57 compact_monitor_1_1777391823165.mp4\n-rw-r--r-- 1 lukas staff 443624 28 Apr 19:02 compact_monitor_1_1777392146221.mp4\n-rw-r--r-- 1 lukas staff 447164 28 Apr 19:07 compact_monitor_1_1777392469679.mp4\n-rw-r--r-- 1 lukas staff 442431 28 Apr 19:13 compact_monitor_1_1777392792794.mp4\n-rw-r--r-- 1 lukas staff 436805 28 Apr 19:18 compact_monitor_1_1777393109301.mp4\n-rw-r--r-- 1 lukas staff 435633 28 Apr 19:23 compact_monitor_1_1777393423192.mp4\n-rw-r--r-- 1 lukas staff 1162510 28 Apr 09:30 compact_monitor_2_1777357806702.mp4\n-rw-r--r-- 1 lukas staff 3394878 28 Apr 09:35 compact_monitor_2_1777358126186.mp4\n-rw-r--r-- 1 lukas staff 268044 28 Apr 09:40 compact_monitor_2_1777358443280.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 09:46 compact_monitor_2_1777358769231.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 09:51 compact_monitor_2_1777359084493.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 09:56 compact_monitor_2_1777359399758.mp4\n-rw-r--r-- 1 lukas staff 266694 28 Apr 10:01 compact_monitor_2_1777359707884.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 10:06 compact_monitor_2_1777360016892.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 10:12 compact_monitor_2_1777360329199.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 10:17 compact_monitor_2_1777360641498.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 10:22 compact_monitor_2_1777360953971.mp4\n-rw-r--r-- 1 lukas staff 267099 28 Apr 10:27 compact_monitor_2_1777361264266.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 10:33 compact_monitor_2_1777361583211.mp4\n-rw-r--r-- 1 lukas staff 266829 28 Apr 10:38 compact_monitor_2_1777361903545.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 10:43 compact_monitor_2_1777362219032.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 10:48 compact_monitor_2_1777362532674.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 10:54 compact_monitor_2_1777362845950.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 10:59 compact_monitor_2_1777363157577.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 11:04 compact_monitor_2_1777363473776.mp4\n-rw-r--r-- 1 lukas staff 267099 28 Apr 11:09 compact_monitor_2_1777363782342.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 11:14 compact_monitor_2_1777364092822.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 11:20 compact_monitor_2_1777364400840.mp4\n-rw-r--r-- 1 lukas staff 266694 28 Apr 11:25 compact_monitor_2_1777364709144.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 11:30 compact_monitor_2_1777365022090.mp4\n-rw-r--r-- 1 lukas staff 264669 28 Apr 11:35 compact_monitor_2_1777365335928.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 11:40 compact_monitor_2_1777365649137.mp4\n-rw-r--r-- 1 lukas staff 266964 28 Apr 11:46 compact_monitor_2_1777365962619.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 11:51 compact_monitor_2_1777366273740.mp4\n-rw-r--r-- 1 lukas staff 265209 28 Apr 11:56 compact_monitor_2_1777366582034.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 12:01 compact_monitor_2_1777366886631.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 12:06 compact_monitor_2_1777367202805.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 12:11 compact_monitor_2_1777367518861.mp4\n-rw-r--r-- 1 lukas staff 269261 28 Apr 12:17 compact_monitor_2_1777367837441.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 12:22 compact_monitor_2_1777368160952.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 12:28 compact_monitor_2_1777368477571.mp4\n-rw-r--r-- 1 lukas staff 267234 28 Apr 12:33 compact_monitor_2_1777368792600.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 12:38 compact_monitor_2_1777369107069.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 12:43 compact_monitor_2_1777369421530.mp4\n-rw-r--r-- 1 lukas staff 266829 28 Apr 12:48 compact_monitor_2_1777369731189.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 12:54 compact_monitor_2_1777370048214.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 12:59 compact_monitor_2_1777370363567.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 13:04 compact_monitor_2_1777370679314.mp4\n-rw-r--r-- 1 lukas staff 268855 28 Apr 13:09 compact_monitor_2_1777370994284.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 13:15 compact_monitor_2_1777371309064.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 13:20 compact_monitor_2_1777371623643.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 13:25 compact_monitor_2_1777371938006.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 13:30 compact_monitor_2_1777372252120.mp4\n-rw-r--r-- 1 lukas staff 266964 28 Apr 13:36 compact_monitor_2_1777372566394.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 13:41 compact_monitor_2_1777372880197.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 13:46 compact_monitor_2_1777373193667.mp4\n-rw-r--r-- 1 lukas staff 265209 28 Apr 13:51 compact_monitor_2_1777373506832.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 13:56 compact_monitor_2_1777373816197.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 14:02 compact_monitor_2_1777374130774.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 14:07 compact_monitor_2_1777374443527.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 14:12 compact_monitor_2_1777374756405.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 14:17 compact_monitor_2_1777375070551.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 14:23 compact_monitor_2_1777375397987.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 14:28 compact_monitor_2_1777375715930.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 14:33 compact_monitor_2_1777376034152.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 14:39 compact_monitor_2_1777376348246.mp4\n-rw-r--r-- 1 lukas staff 266019 28 Apr 14:44 compact_monitor_2_1777376657026.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 14:49 compact_monitor_2_1777376966683.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 14:54 compact_monitor_2_1777377280571.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:00 compact_monitor_2_1777377602616.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:05 compact_monitor_2_1777377915467.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 15:10 compact_monitor_2_1777378232424.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 15:15 compact_monitor_2_1777378547117.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:21 compact_monitor_2_1777378865359.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 15:26 compact_monitor_2_1777379183376.mp4\n-rw-r--r-- 1 lukas staff 267774 28 Apr 15:31 compact_monitor_2_1777379502714.mp4\n-rw-r--r-- 1 lukas staff 268046 28 Apr 15:37 compact_monitor_2_1777379819259.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 15:42 compact_monitor_2_1777380134674.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 15:47 compact_monitor_2_1777380454708.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 15:52 compact_monitor_2_1777380771150.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 15:58 compact_monitor_2_1777381086934.mp4\n-rw-r--r-- 1 lukas staff 268044 28 Apr 16:03 compact_monitor_2_1777381401816.mp4\n-rw-r--r-- 1 lukas staff 269530 28 Apr 16:08 compact_monitor_2_1777381720100.mp4\n-rw-r--r-- 1 lukas staff 268721 28 Apr 16:13 compact_monitor_2_1777382037168.mp4\n-rw-r--r-- 1 lukas staff 268583 28 Apr 16:19 compact_monitor_2_1777382355014.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 16:24 compact_monitor_2_1777382670965.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 16:29 compact_monitor_2_1777382984987.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 16:34 compact_monitor_2_1777383298084.mp4\n-rw-r--r-- 1 lukas staff 236209 28 Apr 16:40 compact_monitor_2_1777383610070.mp4\n-rw-r--r-- 1 lukas staff 1191690 28 Apr 17:01 compact_monitor_2_1777384877981.mp4\n-rw-r--r-- 1 lukas staff 2975861 28 Apr 17:06 compact_monitor_2_1777385201736.mp4\n-rw-r--r-- 1 lukas staff 5319560 28 Apr 17:12 compact_monitor_2_1777385529432.mp4\n-rw-r--r-- 1 lukas staff 3006284 28 Apr 17:18 compact_monitor_2_1777385870812.mp4\n-rw-r--r-- 1 lukas staff 2726877 28 Apr 17:23 compact_monitor_2_1777386204715.mp4\n-rw-r--r-- 1 lukas staff 3315722 28 Apr 17:29 compact_monitor_2_1777386541280.mp4\n-rw-r--r-- 1 lukas staff 1577465 28 Apr 17:34 compact_monitor_2_1777386883461.mp4\n-rw-r--r-- 1 lukas staff 1745214 28 Apr 17:40 compact_monitor_2_1777387214543.mp4\n-rw-r--r-- 1 lukas staff 950993 28 Apr 17:45 compact_monitor_2_1777387552842.mp4\n-rw-r--r-- 1 lukas staff 429007 28 Apr 17:51 compact_monitor_2_1777387889075.mp4\n-rw-r--r-- 1 lukas staff 884099 28 Apr 17:57 compact_monitor_2_1777388218623.mp4\n-rw-r--r-- 1 lukas staff 2352504 28 Apr 18:02 compact_monitor_2_1777388548021.mp4\n-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4\n-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4\n-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4\n-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4\n-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4\n-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4\n-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4\n-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4\n-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4\n-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4\n-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4\n-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4\n-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4\n-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4\n-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22523176\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 28 Apr 16:51 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite\n-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27 \n[2026-05-06 18:58:18] ========================================\n[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 18:58:18] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m04s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m06s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m07s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)\n frames (7543 rows) ⠴ % \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27\n[2026-05-06 19:22:16] ========================================\n[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 19:22:16] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m01s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m03s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ✓ 4m40s\n ocr_text (2193 rows) ✓ 0m25s\n ui_events (9909 rows) ✓ 0m02s\n elements (470235 rows) ✓ 2m46s\n meetings (3 rows) ✓ 0m00s\n\n[+08m07s] ▶ Updating FTS indexes\n elements_fts ✓ 2m59s\n frames_fts ✓ 6m07s\n ui_events_fts ✓ 0m03s\n\n[+17m16s] ▶ Verifying DB\n frames: 7543 / 7543 ✓\n elements: 470235 / 470235 ✓\n ui_events: 9909 / 9909 ✓\n ocr_text: 2193 / 2193 ✓\n meetings: 3 / 3 ✓\n\n[+18m46s] ▶ Copying data folder for 2026-04-27\n rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)\n\n[2026-05-06 19:41:28] Archive DB size: 9.7G\n[2026-05-06 19:41:28] Total time: 19m12s\n[2026-05-06 19:41:28] Sync complete for 2026-04-27\n[2026-05-06 19:41:28] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28\n[2026-05-06 19:44:49] ========================================\n[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28\n[2026-05-06 19:44:49] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (9.7G)\n Data dir: OK (223 files, 159M)\n\n[+00m00s] ▶ Counting source rows for 2026-04-28\n frames: 4535\n elements: 407532\n ui_events: 8621\n ocr_text: 1623\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m00s\n creating FTS tables ✓ 0m00s\n\n[+00m02s] ▶ Syncing data for 2026-04-28\n video_chunks ✓ 0m12s\n frames (4535 rows) ✓ 1m30s\n ocr_text (1623 rows) ✓ 0m32s\n ui_events (8621 rows) ✓ 0m01s\n elements (407532 rows) ✓ 1m02s\n meetings (3 rows) ✓ 0m00s\n\n[+03m19s] ▶ Updating FTS indexes\n elements_fts ✓ 1m36s\n frames_fts ✓ 2m28s\n ui_events_fts ✓ 0m04s\n\n[+07m27s] ▶ Verifying DB\n frames: 4535 / 4535 ✓\n elements: 407532 / 407532 ✓\n ui_events: 8621 / 8621 ✓\n ocr_text: 1623 / 1623 ✓\n meetings: 3 / 3 ✓\n\n[+08m59s] ▶ Copying data folder for 2026-04-28\n rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)\n\n[2026-05-06 19:54:08] Archive DB size: 10G\n[2026-05-06 19:54:08] Total time: 9m19s\n[2026-05-06 19:54:08] Sync complete for 2026-04-28\n[2026-05-06 19:54:08] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll\ntotal 24\ndrwx------ 9 lukas staff 288 28 Apr 09:18 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\ndrwx------ 5 lukas staff 160 1 Nov 2021 _cacache\ndrwx------@ 2 lukas staff 64 28 Apr 09:18 _locks\ndrwx------ 15 lukas staff 480 27 Apr 19:54 _logs\ndrwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx\n-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked\n-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json\n-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll \ntotal 52920\ndrwx------+ 92 lukas staff 2944 6 May 20:22 .\ndrwxr-xr-x 5 root admin 160 23 Aug 2024 ..\n-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding\n-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store\ndrwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash\ndrwx------ 5 lukas staff 160 1 Nov 2021 .aws\n-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json\n-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history\n-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc\ndrwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito\ndrwx------@ 6 lukas staff 192 9 Apr 19:53 .cache\ndrwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude\n-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json\ndrwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium\ndrwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer\ndrwx------ 16 lukas staff 512 21 May 2025 .config\ndrwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue\ndrwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot\ndrwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor\ndrwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor\ndrwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona\ndrwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb\ndrwx------ 24 lukas staff 768 27 Apr 18:14 .docker\ndrwx------ 15 lukas staff 480 6 Jun 2023 .dropbox\ndrwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak\n-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth\n-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig\n-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp\ndrwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon\ndrwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc\n-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst\ndrwx------ 5 lukas staff 160 23 Dec 2024 .local\n-rw------- 1 lukas staff 204 16 Mar 2024 .netrc\ndrwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp\n-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history\n-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer\ndrwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py\ndrwx------ 8 lukas staff 256 6 May 20:24 .npm\n-rw------- 1 lukas staff 74 20 May 2024 .npmrc\ndrwx------ 32 lukas staff 1024 25 Jul 2025 .nvm\ndrwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile\n-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history\ndrwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode\ndrwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight\ndrwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint\ndrwx------ 15 lukas staff 480 8 Aug 2025 .ssh\ndrwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit\ndrwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm\n-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\n UW PICO 5.09 New Buffer \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n [ Read 1 line ] \n^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos \n^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell \ndrwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm\ndrwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf\ndrwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn\n-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc\n-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile\n-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy\n-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave\n-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save\n-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees\n-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc\ndrwx------@ 9 lukas staff 288 20 Apr 20:55 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV\ndrwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads\ndrwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen\ndrwx------@ 112 lukas staff 3584 2 Dec 09:19 Library\ndrwx------ 7 lukas staff 224 12 Feb 2024 Movies\ndrwx------+ 5 lukas staff 160 25 Sep 2023 Music\ndrwx------+ 9 lukas staff 288 25 Sep 2023 Pictures\ndrwx------ 3 lukas staff 96 8 Nov 2021 Postman\ndrwx------+ 4 lukas staff 128 28 Oct 2021 Public\n-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf\ndrwx------ 4 lukas staff 128 2 Jul 2023 Users\n-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log\n-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 2025 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast\n-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin\n-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh\n-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe\ncd: no such file or directory: /Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated\nchecking permissions...\n screen recording: ok\n microphone: ok\n accessibility: ok\n2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap\n2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update\n2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits\n2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown\n2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export\n2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary\n2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ false │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n│ retention mode │ media-only (keep transcripts) │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ MacBook Pro Microphone (input) │\n│ │ System Audio (output) │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-05-06T20:27:34.638384Z INFO screenpipe: starting UI event capture\n2026-05-06T20:27:34.637679Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-05-06T20:27:34.649154Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(94))\n2026-05-06T20:27:34.652794Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-05-06T20:27:34.655839Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-05-06T20:27:34.673877Z INFO screenpipe_engine::ui_recorder: UI recording session started: 54869993-7b4b-491f-b717-2a583517f9c5\n2026-05-06T20:27:34.673910Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-05-06T20:27:34.674057Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-05-05 17:27:34.674056 UTC to 2026-05-06 17:27:34.674056 UTC)\n2026-05-06T20:27:34.674892Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-05-06T20:27:34.675788Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 0 frame entries, coverage from 2026-05-05 17:27:34.674056 UTC\n2026-05-06T20:27:34.686546Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-05-06T20:27:34.691371Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-05-06T20:27:36.270608Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-05-06T20:27:36.270669Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.270714Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.932583Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-05-06T20:27:36.932852Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-05-06T20:27:36.932882Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-05-06T20:27:36.932899Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-05-06T20:27:36.932901Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-05-06T20:27:39.158281Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 3 excluded)\n2026-05-06T20:27:39.593177Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1, dur=101ms\n2026-05-06T20:27:40.672366Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)\n2026-05-06T20:27:41.257664Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=2, dur=140ms\n2026-05-06T20:27:44.641022Z INFO screenpipe_audio::transcription::engine: whisper model available: \"/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin\"\n2026-05-06T20:27:44.641079Z INFO screenpipe_audio::transcription::whisper::model: whisper context: gpu acceleration enabled (Metal on macOS, Vulkan on Windows)\n2026-05-06T20:27:44.641086Z INFO screenpipe_audio::transcription::engine: loading whisper model with GPU acceleration...\nwhisper_init_from_file_with_params_no_state: loading model from '/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin'\nwhisper_init_with_params_no_state: use gpu = 1\nwhisper_init_with_params_no_state: flash attn = 0\nwhisper_init_with_params_no_state: gpu_device = 0\nwhisper_init_with_params_no_state: dtw = 0\nggml_metal_device_init: tensor API disabled for pre-M5 and pre-A19 devices\nggml_metal_library_init: using embedded metal library\nggml_metal_library_init: loaded in 0.041 sec\nggml_metal_rsets_init: creating a residency set collection (keep_alive = 180 s)\nggml_metal_device_init: GPU name: Apple M1\nggml_metal_device_init: GPU family: MTLGPUFamilyApple7 (1007)\nggml_metal_device_init: GPU family: MTLGPUFamilyCommon3 (3003)\nggml_metal_device_init: GPU family: MTLGPUFamilyMetal3 (5001)\nggml_metal_device_init: simdgroup reduction = true\nggml_metal_device_init: simdgroup matrix mul. = true\nggml_metal_device_init: has unified memory = true\nggml_metal_device_init: has bfloat = true\nggml_metal_device_init: has tensor = false\nggml_metal_device_init: use residency sets = true\nggml_metal_device_init: use shared buffers = true\nggml_metal_device_init: recommendedMaxWorkingSetSize = 11453.25 MB\nwhisper_init_with_params_no_state: devices = 3\nwhisper_init_with_params_no_state: backends = 3\nwhisper_model_load: loading model\nwhisper_model_load: n_vocab = 51865\nwhisper_model_load: n_audio_ctx = 1500\nwhisper_model_load: n_audio_state = 384\nwhisper_model_load: n_audio_head = 6\nwhisper_model_load: n_audio_layer = 4\nwhisper_model_load: n_text_ctx = 448\nwhisper_model_load: n_text_state = 384\nwhisper_model_load: n_text_head = 6\nwhisper_model_load: n_text_layer = 4\nwhisper_model_load: n_mels = 80\nwhisper_model_load: ftype = 1\nwhisper_model_load: qntvr = 0\nwhisper_model_load: type = 1 (tiny)\nwhisper_model_load: adding 1608 extra tokens\nwhisper_model_load: n_langs = 99\nwhisper_model_load: Metal total size = 77.11 MB\nwhisper_model_load: model size = 77.11 MB\n2026-05-06T20:27:44.857210Z INFO screenpipe_audio::transcription::engine: whisper model loaded successfully\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\n2026-05-06T20:27:44.861912Z INFO screenpipe_audio::audio_manager::manager: transcription session created (will be reused across segments)\n2026-05-06T20:27:44.862480Z INFO screenpipe_audio::audio_manager::manager: audio manager started\n2026-05-06T20:27:44.862525Z INFO screenpipe_audio::audio_manager::manager: calendar-assisted speaker diarization: listening for meeting events\n2026-05-06T20:27:47.831980Z INFO screenpipe_audio::device::device_manager: starting recording for device: System Audio (output)\n2026-05-06T20:27:47.832191Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for System Audio (output) (unknown / 30s segments)\n2026-05-06T20:27:47.906029Z INFO screenpipe_audio::device::device_manager: starting recording for device: MacBook Pro Microphone (input)\n2026-05-06T20:27:47.906090Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for MacBook Pro Microphone (input) (wired / 30s segments)","depth":4,"on_screen":true,"value":"-rw-r--r-- 1 lukas staff 1702453 28 Apr 17:23 compact_monitor_1_1777386198870.mp4\n-rw-r--r-- 1 lukas staff 2034287 28 Apr 17:29 compact_monitor_1_1777386532344.mp4\n-rw-r--r-- 1 lukas staff 1352893 28 Apr 17:34 compact_monitor_1_1777386875277.mp4\n-rw-r--r-- 1 lukas staff 1873946 28 Apr 17:40 compact_monitor_1_1777387208685.mp4\n-rw-r--r-- 1 lukas staff 1155463 28 Apr 17:45 compact_monitor_1_1777387548798.mp4\n-rw-r--r-- 1 lukas staff 1428159 28 Apr 17:51 compact_monitor_1_1777387882691.mp4\n-rw-r--r-- 1 lukas staff 1398484 28 Apr 17:56 compact_monitor_1_1777388213861.mp4\n-rw-r--r-- 1 lukas staff 1688438 28 Apr 18:02 compact_monitor_1_1777388542869.mp4\n-rw-r--r-- 1 lukas staff 2401161 28 Apr 18:07 compact_monitor_1_1777388869470.mp4\n-rw-r--r-- 1 lukas staff 1283247 28 Apr 18:13 compact_monitor_1_1777389192202.mp4\n-rw-r--r-- 1 lukas staff 1398160 28 Apr 18:18 compact_monitor_1_1777389525394.mp4\n-rw-r--r-- 1 lukas staff 452906 28 Apr 18:24 compact_monitor_1_1777389856559.mp4\n-rw-r--r-- 1 lukas staff 566518 28 Apr 18:29 compact_monitor_1_1777390191054.mp4\n-rw-r--r-- 1 lukas staff 445894 28 Apr 18:35 compact_monitor_1_1777390513567.mp4\n-rw-r--r-- 1 lukas staff 444044 28 Apr 18:40 compact_monitor_1_1777390841877.mp4\n-rw-r--r-- 1 lukas staff 437853 28 Apr 18:46 compact_monitor_1_1777391162552.mp4\n-rw-r--r-- 1 lukas staff 441008 28 Apr 18:51 compact_monitor_1_1777391489107.mp4\n-rw-r--r-- 1 lukas staff 443934 28 Apr 18:57 compact_monitor_1_1777391823165.mp4\n-rw-r--r-- 1 lukas staff 443624 28 Apr 19:02 compact_monitor_1_1777392146221.mp4\n-rw-r--r-- 1 lukas staff 447164 28 Apr 19:07 compact_monitor_1_1777392469679.mp4\n-rw-r--r-- 1 lukas staff 442431 28 Apr 19:13 compact_monitor_1_1777392792794.mp4\n-rw-r--r-- 1 lukas staff 436805 28 Apr 19:18 compact_monitor_1_1777393109301.mp4\n-rw-r--r-- 1 lukas staff 435633 28 Apr 19:23 compact_monitor_1_1777393423192.mp4\n-rw-r--r-- 1 lukas staff 1162510 28 Apr 09:30 compact_monitor_2_1777357806702.mp4\n-rw-r--r-- 1 lukas staff 3394878 28 Apr 09:35 compact_monitor_2_1777358126186.mp4\n-rw-r--r-- 1 lukas staff 268044 28 Apr 09:40 compact_monitor_2_1777358443280.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 09:46 compact_monitor_2_1777358769231.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 09:51 compact_monitor_2_1777359084493.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 09:56 compact_monitor_2_1777359399758.mp4\n-rw-r--r-- 1 lukas staff 266694 28 Apr 10:01 compact_monitor_2_1777359707884.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 10:06 compact_monitor_2_1777360016892.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 10:12 compact_monitor_2_1777360329199.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 10:17 compact_monitor_2_1777360641498.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 10:22 compact_monitor_2_1777360953971.mp4\n-rw-r--r-- 1 lukas staff 267099 28 Apr 10:27 compact_monitor_2_1777361264266.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 10:33 compact_monitor_2_1777361583211.mp4\n-rw-r--r-- 1 lukas staff 266829 28 Apr 10:38 compact_monitor_2_1777361903545.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 10:43 compact_monitor_2_1777362219032.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 10:48 compact_monitor_2_1777362532674.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 10:54 compact_monitor_2_1777362845950.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 10:59 compact_monitor_2_1777363157577.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 11:04 compact_monitor_2_1777363473776.mp4\n-rw-r--r-- 1 lukas staff 267099 28 Apr 11:09 compact_monitor_2_1777363782342.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 11:14 compact_monitor_2_1777364092822.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 11:20 compact_monitor_2_1777364400840.mp4\n-rw-r--r-- 1 lukas staff 266694 28 Apr 11:25 compact_monitor_2_1777364709144.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 11:30 compact_monitor_2_1777365022090.mp4\n-rw-r--r-- 1 lukas staff 264669 28 Apr 11:35 compact_monitor_2_1777365335928.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 11:40 compact_monitor_2_1777365649137.mp4\n-rw-r--r-- 1 lukas staff 266964 28 Apr 11:46 compact_monitor_2_1777365962619.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 11:51 compact_monitor_2_1777366273740.mp4\n-rw-r--r-- 1 lukas staff 265209 28 Apr 11:56 compact_monitor_2_1777366582034.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 12:01 compact_monitor_2_1777366886631.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 12:06 compact_monitor_2_1777367202805.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 12:11 compact_monitor_2_1777367518861.mp4\n-rw-r--r-- 1 lukas staff 269261 28 Apr 12:17 compact_monitor_2_1777367837441.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 12:22 compact_monitor_2_1777368160952.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 12:28 compact_monitor_2_1777368477571.mp4\n-rw-r--r-- 1 lukas staff 267234 28 Apr 12:33 compact_monitor_2_1777368792600.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 12:38 compact_monitor_2_1777369107069.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 12:43 compact_monitor_2_1777369421530.mp4\n-rw-r--r-- 1 lukas staff 266829 28 Apr 12:48 compact_monitor_2_1777369731189.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 12:54 compact_monitor_2_1777370048214.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 12:59 compact_monitor_2_1777370363567.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 13:04 compact_monitor_2_1777370679314.mp4\n-rw-r--r-- 1 lukas staff 268855 28 Apr 13:09 compact_monitor_2_1777370994284.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 13:15 compact_monitor_2_1777371309064.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 13:20 compact_monitor_2_1777371623643.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 13:25 compact_monitor_2_1777371938006.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 13:30 compact_monitor_2_1777372252120.mp4\n-rw-r--r-- 1 lukas staff 266964 28 Apr 13:36 compact_monitor_2_1777372566394.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 13:41 compact_monitor_2_1777372880197.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 13:46 compact_monitor_2_1777373193667.mp4\n-rw-r--r-- 1 lukas staff 265209 28 Apr 13:51 compact_monitor_2_1777373506832.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 13:56 compact_monitor_2_1777373816197.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 14:02 compact_monitor_2_1777374130774.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 14:07 compact_monitor_2_1777374443527.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 14:12 compact_monitor_2_1777374756405.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 14:17 compact_monitor_2_1777375070551.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 14:23 compact_monitor_2_1777375397987.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 14:28 compact_monitor_2_1777375715930.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 14:33 compact_monitor_2_1777376034152.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 14:39 compact_monitor_2_1777376348246.mp4\n-rw-r--r-- 1 lukas staff 266019 28 Apr 14:44 compact_monitor_2_1777376657026.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 14:49 compact_monitor_2_1777376966683.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 14:54 compact_monitor_2_1777377280571.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:00 compact_monitor_2_1777377602616.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:05 compact_monitor_2_1777377915467.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 15:10 compact_monitor_2_1777378232424.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 15:15 compact_monitor_2_1777378547117.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:21 compact_monitor_2_1777378865359.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 15:26 compact_monitor_2_1777379183376.mp4\n-rw-r--r-- 1 lukas staff 267774 28 Apr 15:31 compact_monitor_2_1777379502714.mp4\n-rw-r--r-- 1 lukas staff 268046 28 Apr 15:37 compact_monitor_2_1777379819259.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 15:42 compact_monitor_2_1777380134674.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 15:47 compact_monitor_2_1777380454708.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 15:52 compact_monitor_2_1777380771150.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 15:58 compact_monitor_2_1777381086934.mp4\n-rw-r--r-- 1 lukas staff 268044 28 Apr 16:03 compact_monitor_2_1777381401816.mp4\n-rw-r--r-- 1 lukas staff 269530 28 Apr 16:08 compact_monitor_2_1777381720100.mp4\n-rw-r--r-- 1 lukas staff 268721 28 Apr 16:13 compact_monitor_2_1777382037168.mp4\n-rw-r--r-- 1 lukas staff 268583 28 Apr 16:19 compact_monitor_2_1777382355014.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 16:24 compact_monitor_2_1777382670965.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 16:29 compact_monitor_2_1777382984987.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 16:34 compact_monitor_2_1777383298084.mp4\n-rw-r--r-- 1 lukas staff 236209 28 Apr 16:40 compact_monitor_2_1777383610070.mp4\n-rw-r--r-- 1 lukas staff 1191690 28 Apr 17:01 compact_monitor_2_1777384877981.mp4\n-rw-r--r-- 1 lukas staff 2975861 28 Apr 17:06 compact_monitor_2_1777385201736.mp4\n-rw-r--r-- 1 lukas staff 5319560 28 Apr 17:12 compact_monitor_2_1777385529432.mp4\n-rw-r--r-- 1 lukas staff 3006284 28 Apr 17:18 compact_monitor_2_1777385870812.mp4\n-rw-r--r-- 1 lukas staff 2726877 28 Apr 17:23 compact_monitor_2_1777386204715.mp4\n-rw-r--r-- 1 lukas staff 3315722 28 Apr 17:29 compact_monitor_2_1777386541280.mp4\n-rw-r--r-- 1 lukas staff 1577465 28 Apr 17:34 compact_monitor_2_1777386883461.mp4\n-rw-r--r-- 1 lukas staff 1745214 28 Apr 17:40 compact_monitor_2_1777387214543.mp4\n-rw-r--r-- 1 lukas staff 950993 28 Apr 17:45 compact_monitor_2_1777387552842.mp4\n-rw-r--r-- 1 lukas staff 429007 28 Apr 17:51 compact_monitor_2_1777387889075.mp4\n-rw-r--r-- 1 lukas staff 884099 28 Apr 17:57 compact_monitor_2_1777388218623.mp4\n-rw-r--r-- 1 lukas staff 2352504 28 Apr 18:02 compact_monitor_2_1777388548021.mp4\n-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4\n-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4\n-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4\n-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4\n-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4\n-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4\n-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4\n-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4\n-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4\n-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4\n-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4\n-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4\n-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4\n-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4\n-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22523176\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 28 Apr 16:51 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite\n-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27 \n[2026-05-06 18:58:18] ========================================\n[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 18:58:18] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m04s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m06s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m07s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)\n frames (7543 rows) ⠴ % \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27\n[2026-05-06 19:22:16] ========================================\n[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 19:22:16] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m01s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m03s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ✓ 4m40s\n ocr_text (2193 rows) ✓ 0m25s\n ui_events (9909 rows) ✓ 0m02s\n elements (470235 rows) ✓ 2m46s\n meetings (3 rows) ✓ 0m00s\n\n[+08m07s] ▶ Updating FTS indexes\n elements_fts ✓ 2m59s\n frames_fts ✓ 6m07s\n ui_events_fts ✓ 0m03s\n\n[+17m16s] ▶ Verifying DB\n frames: 7543 / 7543 ✓\n elements: 470235 / 470235 ✓\n ui_events: 9909 / 9909 ✓\n ocr_text: 2193 / 2193 ✓\n meetings: 3 / 3 ✓\n\n[+18m46s] ▶ Copying data folder for 2026-04-27\n rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)\n\n[2026-05-06 19:41:28] Archive DB size: 9.7G\n[2026-05-06 19:41:28] Total time: 19m12s\n[2026-05-06 19:41:28] Sync complete for 2026-04-27\n[2026-05-06 19:41:28] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28\n[2026-05-06 19:44:49] ========================================\n[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28\n[2026-05-06 19:44:49] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (9.7G)\n Data dir: OK (223 files, 159M)\n\n[+00m00s] ▶ Counting source rows for 2026-04-28\n frames: 4535\n elements: 407532\n ui_events: 8621\n ocr_text: 1623\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m00s\n creating FTS tables ✓ 0m00s\n\n[+00m02s] ▶ Syncing data for 2026-04-28\n video_chunks ✓ 0m12s\n frames (4535 rows) ✓ 1m30s\n ocr_text (1623 rows) ✓ 0m32s\n ui_events (8621 rows) ✓ 0m01s\n elements (407532 rows) ✓ 1m02s\n meetings (3 rows) ✓ 0m00s\n\n[+03m19s] ▶ Updating FTS indexes\n elements_fts ✓ 1m36s\n frames_fts ✓ 2m28s\n ui_events_fts ✓ 0m04s\n\n[+07m27s] ▶ Verifying DB\n frames: 4535 / 4535 ✓\n elements: 407532 / 407532 ✓\n ui_events: 8621 / 8621 ✓\n ocr_text: 1623 / 1623 ✓\n meetings: 3 / 3 ✓\n\n[+08m59s] ▶ Copying data folder for 2026-04-28\n rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)\n\n[2026-05-06 19:54:08] Archive DB size: 10G\n[2026-05-06 19:54:08] Total time: 9m19s\n[2026-05-06 19:54:08] Sync complete for 2026-04-28\n[2026-05-06 19:54:08] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll\ntotal 24\ndrwx------ 9 lukas staff 288 28 Apr 09:18 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\ndrwx------ 5 lukas staff 160 1 Nov 2021 _cacache\ndrwx------@ 2 lukas staff 64 28 Apr 09:18 _locks\ndrwx------ 15 lukas staff 480 27 Apr 19:54 _logs\ndrwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx\n-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked\n-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json\n-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll \ntotal 52920\ndrwx------+ 92 lukas staff 2944 6 May 20:22 .\ndrwxr-xr-x 5 root admin 160 23 Aug 2024 ..\n-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding\n-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store\ndrwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash\ndrwx------ 5 lukas staff 160 1 Nov 2021 .aws\n-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json\n-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history\n-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc\ndrwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito\ndrwx------@ 6 lukas staff 192 9 Apr 19:53 .cache\ndrwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude\n-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json\ndrwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium\ndrwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer\ndrwx------ 16 lukas staff 512 21 May 2025 .config\ndrwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue\ndrwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot\ndrwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor\ndrwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor\ndrwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona\ndrwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb\ndrwx------ 24 lukas staff 768 27 Apr 18:14 .docker\ndrwx------ 15 lukas staff 480 6 Jun 2023 .dropbox\ndrwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak\n-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth\n-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig\n-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp\ndrwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon\ndrwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc\n-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst\ndrwx------ 5 lukas staff 160 23 Dec 2024 .local\n-rw------- 1 lukas staff 204 16 Mar 2024 .netrc\ndrwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp\n-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history\n-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer\ndrwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py\ndrwx------ 8 lukas staff 256 6 May 20:24 .npm\n-rw------- 1 lukas staff 74 20 May 2024 .npmrc\ndrwx------ 32 lukas staff 1024 25 Jul 2025 .nvm\ndrwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile\n-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history\ndrwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode\ndrwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight\ndrwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint\ndrwx------ 15 lukas staff 480 8 Aug 2025 .ssh\ndrwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit\ndrwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm\n-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\n UW PICO 5.09 New Buffer \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n [ Read 1 line ] \n^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos \n^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell \ndrwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm\ndrwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf\ndrwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn\n-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc\n-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile\n-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy\n-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave\n-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save\n-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees\n-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc\ndrwx------@ 9 lukas staff 288 20 Apr 20:55 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV\ndrwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads\ndrwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen\ndrwx------@ 112 lukas staff 3584 2 Dec 09:19 Library\ndrwx------ 7 lukas staff 224 12 Feb 2024 Movies\ndrwx------+ 5 lukas staff 160 25 Sep 2023 Music\ndrwx------+ 9 lukas staff 288 25 Sep 2023 Pictures\ndrwx------ 3 lukas staff 96 8 Nov 2021 Postman\ndrwx------+ 4 lukas staff 128 28 Oct 2021 Public\n-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf\ndrwx------ 4 lukas staff 128 2 Jul 2023 Users\n-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log\n-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 2025 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast\n-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin\n-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh\n-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe\ncd: no such file or directory: /Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated\nchecking permissions...\n screen recording: ok\n microphone: ok\n accessibility: ok\n2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap\n2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update\n2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits\n2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown\n2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export\n2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary\n2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ false │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n│ retention mode │ media-only (keep transcripts) │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ MacBook Pro Microphone (input) │\n│ │ System Audio (output) │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-05-06T20:27:34.638384Z INFO screenpipe: starting UI event capture\n2026-05-06T20:27:34.637679Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-05-06T20:27:34.649154Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(94))\n2026-05-06T20:27:34.652794Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-05-06T20:27:34.655839Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-05-06T20:27:34.673877Z INFO screenpipe_engine::ui_recorder: UI recording session started: 54869993-7b4b-491f-b717-2a583517f9c5\n2026-05-06T20:27:34.673910Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-05-06T20:27:34.674057Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-05-05 17:27:34.674056 UTC to 2026-05-06 17:27:34.674056 UTC)\n2026-05-06T20:27:34.674892Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-05-06T20:27:34.675788Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 0 frame entries, coverage from 2026-05-05 17:27:34.674056 UTC\n2026-05-06T20:27:34.686546Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-05-06T20:27:34.691371Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-05-06T20:27:36.270608Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-05-06T20:27:36.270669Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.270714Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.932583Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-05-06T20:27:36.932852Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-05-06T20:27:36.932882Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-05-06T20:27:36.932899Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-05-06T20:27:36.932901Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-05-06T20:27:39.158281Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 3 excluded)\n2026-05-06T20:27:39.593177Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1, dur=101ms\n2026-05-06T20:27:40.672366Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)\n2026-05-06T20:27:41.257664Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=2, dur=140ms\n2026-05-06T20:27:44.641022Z INFO screenpipe_audio::transcription::engine: whisper model available: \"/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin\"\n2026-05-06T20:27:44.641079Z INFO screenpipe_audio::transcription::whisper::model: whisper context: gpu acceleration enabled (Metal on macOS, Vulkan on Windows)\n2026-05-06T20:27:44.641086Z INFO screenpipe_audio::transcription::engine: loading whisper model with GPU acceleration...\nwhisper_init_from_file_with_params_no_state: loading model from '/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin'\nwhisper_init_with_params_no_state: use gpu = 1\nwhisper_init_with_params_no_state: flash attn = 0\nwhisper_init_with_params_no_state: gpu_device = 0\nwhisper_init_with_params_no_state: dtw = 0\nggml_metal_device_init: tensor API disabled for pre-M5 and pre-A19 devices\nggml_metal_library_init: using embedded metal library\nggml_metal_library_init: loaded in 0.041 sec\nggml_metal_rsets_init: creating a residency set collection (keep_alive = 180 s)\nggml_metal_device_init: GPU name: Apple M1\nggml_metal_device_init: GPU family: MTLGPUFamilyApple7 (1007)\nggml_metal_device_init: GPU family: MTLGPUFamilyCommon3 (3003)\nggml_metal_device_init: GPU family: MTLGPUFamilyMetal3 (5001)\nggml_metal_device_init: simdgroup reduction = true\nggml_metal_device_init: simdgroup matrix mul. = true\nggml_metal_device_init: has unified memory = true\nggml_metal_device_init: has bfloat = true\nggml_metal_device_init: has tensor = false\nggml_metal_device_init: use residency sets = true\nggml_metal_device_init: use shared buffers = true\nggml_metal_device_init: recommendedMaxWorkingSetSize = 11453.25 MB\nwhisper_init_with_params_no_state: devices = 3\nwhisper_init_with_params_no_state: backends = 3\nwhisper_model_load: loading model\nwhisper_model_load: n_vocab = 51865\nwhisper_model_load: n_audio_ctx = 1500\nwhisper_model_load: n_audio_state = 384\nwhisper_model_load: n_audio_head = 6\nwhisper_model_load: n_audio_layer = 4\nwhisper_model_load: n_text_ctx = 448\nwhisper_model_load: n_text_state = 384\nwhisper_model_load: n_text_head = 6\nwhisper_model_load: n_text_layer = 4\nwhisper_model_load: n_mels = 80\nwhisper_model_load: ftype = 1\nwhisper_model_load: qntvr = 0\nwhisper_model_load: type = 1 (tiny)\nwhisper_model_load: adding 1608 extra tokens\nwhisper_model_load: n_langs = 99\nwhisper_model_load: Metal total size = 77.11 MB\nwhisper_model_load: model size = 77.11 MB\n2026-05-06T20:27:44.857210Z INFO screenpipe_audio::transcription::engine: whisper model loaded successfully\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\n2026-05-06T20:27:44.861912Z INFO screenpipe_audio::audio_manager::manager: transcription session created (will be reused across segments)\n2026-05-06T20:27:44.862480Z INFO screenpipe_audio::audio_manager::manager: audio manager started\n2026-05-06T20:27:44.862525Z INFO screenpipe_audio::audio_manager::manager: calendar-assisted speaker diarization: listening for meeting events\n2026-05-06T20:27:47.831980Z INFO screenpipe_audio::device::device_manager: starting recording for device: System Audio (output)\n2026-05-06T20:27:47.832191Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for System Audio (output) (unknown / 30s segments)\n2026-05-06T20:27:47.906029Z INFO screenpipe_audio::device::device_manager: starting recording for device: MacBook Pro Microphone (input)\n2026-05-06T20:27:47.906090Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for MacBook Pro Microphone (input) (wired / 30s segments)","is_focused":true},{"role":"AXTextField","text":"you","depth":3,"bounds":{"left":0.7888889,"top":0.10555556,"width":0.13055556,"height":0.024444444},"on_screen":true,"automation_id":"_NS:65","value":"you","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.7902778,"top":0.10555556,"width":0.017361112,"height":0.024444444},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.9013889,"top":0.10555556,"width":0.015277778,"height":0.024444444},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.925,"top":0.10666667,"width":0.014583333,"height":0.023333333},"on_screen":true,"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.93958336,"top":0.10666667,"width":0.014583333,"height":0.023333333},"on_screen":true,"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.47083333,"top":0.033333335,"width":0.058333334,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-8608554010568040663
|
5579017683957906497
|
visual_change
|
accessibility
|
NULL
|
-rw-r--r-- 1 lukas staff 1702453 28 Apr 17:23 -rw-r--r-- 1 lukas staff 1702453 28 Apr 17:23 compact_monitor_1_1777386198870.mp4
-rw-r--r-- 1 lukas staff 2034287 28 Apr 17:29 compact_monitor_1_1777386532344.mp4
-rw-r--r-- 1 lukas staff 1352893 28 Apr 17:34 compact_monitor_1_1777386875277.mp4
-rw-r--r-- 1 lukas staff 1873946 28 Apr 17:40 compact_monitor_1_1777387208685.mp4
-rw-r--r-- 1 lukas staff 1155463 28 Apr 17:45 compact_monitor_1_1777387548798.mp4
-rw-r--r-- 1 lukas staff 1428159 28 Apr 17:51 compact_monitor_1_1777387882691.mp4
-rw-r--r-- 1 lukas staff 1398484 28 Apr 17:56 compact_monitor_1_1777388213861.mp4
-rw-r--r-- 1 lukas staff 1688438 28 Apr 18:02 compact_monitor_1_1777388542869.mp4
-rw-r--r-- 1 lukas staff 2401161 28 Apr 18:07 compact_monitor_1_1777388869470.mp4
-rw-r--r-- 1 lukas staff 1283247 28 Apr 18:13 compact_monitor_1_1777389192202.mp4
-rw-r--r-- 1 lukas staff 1398160 28 Apr 18:18 compact_monitor_1_1777389525394.mp4
-rw-r--r-- 1 lukas staff 452906 28 Apr 18:24 compact_monitor_1_1777389856559.mp4
-rw-r--r-- 1 lukas staff 566518 28 Apr 18:29 compact_monitor_1_1777390191054.mp4
-rw-r--r-- 1 lukas staff 445894 28 Apr 18:35 compact_monitor_1_1777390513567.mp4
-rw-r--r-- 1 lukas staff 444044 28 Apr 18:40 compact_monitor_1_1777390841877.mp4
-rw-r--r-- 1 lukas staff 437853 28 Apr 18:46 compact_monitor_1_1777391162552.mp4
-rw-r--r-- 1 lukas staff 441008 28 Apr 18:51 compact_monitor_1_1777391489107.mp4
-rw-r--r-- 1 lukas staff 443934 28 Apr 18:57 compact_monitor_1_1777391823165.mp4
-rw-r--r-- 1 lukas staff 443624 28 Apr 19:02 compact_monitor_1_1777392146221.mp4
-rw-r--r-- 1 lukas staff 447164 28 Apr 19:07 compact_monitor_1_1777392469679.mp4
-rw-r--r-- 1 lukas staff 442431 28 Apr 19:13 compact_monitor_1_1777392792794.mp4
-rw-r--r-- 1 lukas staff 436805 28 Apr 19:18 compact_monitor_1_1777393109301.mp4
-rw-r--r-- 1 lukas staff 435633 28 Apr 19:23 compact_monitor_1_1777393423192.mp4
-rw-r--r-- 1 lukas staff 1162510 28 Apr 09:30 compact_monitor_2_1777357806702.mp4
-rw-r--r-- 1 lukas staff 3394878 28 Apr 09:35 compact_monitor_2_1777358126186.mp4
-rw-r--r-- 1 lukas staff 268044 28 Apr 09:40 compact_monitor_2_1777358443280.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 09:46 compact_monitor_2_1777358769231.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 09:51 compact_monitor_2_1777359084493.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 09:56 compact_monitor_2_1777359399758.mp4
-rw-r--r-- 1 lukas staff 266694 28 Apr 10:01 compact_monitor_2_1777359707884.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 10:06 compact_monitor_2_1777360016892.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 10:12 compact_monitor_2_1777360329199.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 10:17 compact_monitor_2_1777360641498.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 10:22 compact_monitor_2_1777360953971.mp4
-rw-r--r-- 1 lukas staff 267099 28 Apr 10:27 compact_monitor_2_1777361264266.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 10:33 compact_monitor_2_1777361583211.mp4
-rw-r--r-- 1 lukas staff 266829 28 Apr 10:38 compact_monitor_2_1777361903545.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 10:43 compact_monitor_2_1777362219032.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 10:48 compact_monitor_2_1777362532674.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 10:54 compact_monitor_2_1777362845950.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 10:59 compact_monitor_2_1777363157577.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 11:04 compact_monitor_2_1777363473776.mp4
-rw-r--r-- 1 lukas staff 267099 28 Apr 11:09 compact_monitor_2_1777363782342.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 11:14 compact_monitor_2_1777364092822.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 11:20 compact_monitor_2_1777364400840.mp4
-rw-r--r-- 1 lukas staff 266694 28 Apr 11:25 compact_monitor_2_1777364709144.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 11:30 compact_monitor_2_1777365022090.mp4
-rw-r--r-- 1 lukas staff 264669 28 Apr 11:35 compact_monitor_2_1777365335928.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 11:40 compact_monitor_2_1777365649137.mp4
-rw-r--r-- 1 lukas staff 266964 28 Apr 11:46 compact_monitor_2_1777365962619.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 11:51 compact_monitor_2_1777366273740.mp4
-rw-r--r-- 1 lukas staff 265209 28 Apr 11:56 compact_monitor_2_1777366582034.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 12:01 compact_monitor_2_1777366886631.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 12:06 compact_monitor_2_1777367202805.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 12:11 compact_monitor_2_1777367518861.mp4
-rw-r--r-- 1 lukas staff 269261 28 Apr 12:17 compact_monitor_2_1777367837441.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 12:22 compact_monitor_2_1777368160952.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 12:28 compact_monitor_2_1777368477571.mp4
-rw-r--r-- 1 lukas staff 267234 28 Apr 12:33 compact_monitor_2_1777368792600.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 12:38 compact_monitor_2_1777369107069.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 12:43 compact_monitor_2_1777369421530.mp4
-rw-r--r-- 1 lukas staff 266829 28 Apr 12:48 compact_monitor_2_1777369731189.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 12:54 compact_monitor_2_1777370048214.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 12:59 compact_monitor_2_1777370363567.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 13:04 compact_monitor_2_1777370679314.mp4
-rw-r--r-- 1 lukas staff 268855 28 Apr 13:09 compact_monitor_2_1777370994284.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 13:15 compact_monitor_2_1777371309064.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 13:20 compact_monitor_2_1777371623643.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 13:25 compact_monitor_2_1777371938006.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 13:30 compact_monitor_2_1777372252120.mp4
-rw-r--r-- 1 lukas staff 266964 28 Apr 13:36 compact_monitor_2_1777372566394.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 13:41 compact_monitor_2_1777372880197.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 13:46 compact_monitor_2_1777373193667.mp4
-rw-r--r-- 1 lukas staff 265209 28 Apr 13:51 compact_monitor_2_1777373506832.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 13:56 compact_monitor_2_1777373816197.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 14:02 compact_monitor_2_1777374130774.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 14:07 compact_monitor_2_1777374443527.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 14:12 compact_monitor_2_1777374756405.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 14:17 compact_monitor_2_1777375070551.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 14:23 compact_monitor_2_1777375397987.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 14:28 compact_monitor_2_1777375715930.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 14:33 compact_monitor_2_1777376034152.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 14:39 compact_monitor_2_1777376348246.mp4
-rw-r--r-- 1 lukas staff 266019 28 Apr 14:44 compact_monitor_2_1777376657026.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 14:49 compact_monitor_2_1777376966683.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 14:54 compact_monitor_2_1777377280571.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:00 compact_monitor_2_1777377602616.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:05 compact_monitor_2_1777377915467.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 15:10 compact_monitor_2_1777378232424.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 15:15 compact_monitor_2_1777378547117.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:21 compact_monitor_2_1777378865359.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 15:26 compact_monitor_2_1777379183376.mp4
-rw-r--r-- 1 lukas staff 267774 28 Apr 15:31 compact_monitor_2_1777379502714.mp4
-rw-r--r-- 1 lukas staff 268046 28 Apr 15:37 compact_monitor_2_1777379819259.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 15:42 compact_monitor_2_1777380134674.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 15:47 compact_monitor_2_1777380454708.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 15:52 compact_monitor_2_1777380771150.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 15:58 compact_monitor_2_1777381086934.mp4
-rw-r--r-- 1 lukas staff 268044 28 Apr 16:03 compact_monitor_2_1777381401816.mp4
-rw-r--r-- 1 lukas staff 269530 28 Apr 16:08 compact_monitor_2_1777381720100.mp4
-rw-r--r-- 1 lukas staff 268721 28 Apr 16:13 compact_monitor_2_1777382037168.mp4
-rw-r--r-- 1 lukas staff 268583 28 Apr 16:19 compact_monitor_2_1777382355014.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 16:24 compact_monitor_2_1777382670965.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 16:29 compact_monitor_2_1777382984987.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 16:34 compact_monitor_2_1777383298084.mp4
-rw-r--r-- 1 lukas staff 236209 28 Apr 16:40 compact_monitor_2_1777383610070.mp4
-rw-r--r-- 1 lukas staff 1191690 28 Apr 17:01 compact_monitor_2_1777384877981.mp4
-rw-r--r-- 1 lukas staff 2975861 28 Apr 17:06 compact_monitor_2_1777385201736.mp4
-rw-r--r-- 1 lukas staff 5319560 28 Apr 17:12 compact_monitor_2_1777385529432.mp4
-rw-r--r-- 1 lukas staff 3006284 28 Apr 17:18 compact_monitor_2_1777385870812.mp4
-rw-r--r-- 1 lukas staff 2726877 28 Apr 17:23 compact_monitor_2_1777386204715.mp4
-rw-r--r-- 1 lukas staff 3315722 28 Apr 17:29 compact_monitor_2_1777386541280.mp4
-rw-r--r-- 1 lukas staff 1577465 28 Apr 17:34 compact_monitor_2_1777386883461.mp4
-rw-r--r-- 1 lukas staff 1745214 28 Apr 17:40 compact_monitor_2_1777387214543.mp4
-rw-r--r-- 1 lukas staff 950993 28 Apr 17:45 compact_monitor_2_1777387552842.mp4
-rw-r--r-- 1 lukas staff 429007 28 Apr 17:51 compact_monitor_2_1777387889075.mp4
-rw-r--r-- 1 lukas staff 884099 28 Apr 17:57 compact_monitor_2_1777388218623.mp4
-rw-r--r-- 1 lukas staff 2352504 28 Apr 18:02 compact_monitor_2_1777388548021.mp4
-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4
-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4
-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4
-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4
-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4
-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4
-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4
-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4
-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4
-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4
-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4
-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4
-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4
-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4
-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22523176
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 28 Apr 16:51 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite
-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm
-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 18:58:18] ========================================
[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27
[2026-05-06 18:58:18] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m04s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m06s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m07s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)
frames (7543 rows) ⠴ %
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 19:22:16] ========================================
[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27
[2026-05-06 19:22:16] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m01s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m03s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ✓ 4m40s
ocr_text (2193 rows) ✓ 0m25s
ui_events (9909 rows) ✓ 0m02s
elements (470235 rows) ✓ 2m46s
meetings (3 rows) ✓ 0m00s
[+08m07s] ▶ Updating FTS indexes
elements_fts ✓ 2m59s
frames_fts ✓ 6m07s
ui_events_fts ✓ 0m03s
[+17m16s] ▶ Verifying DB
frames: 7543 / 7543 ✓
elements: 470235 / 470235 ✓
ui_events: 9909 / 9909 ✓
ocr_text: 2193 / 2193 ✓
meetings: 3 / 3 ✓
[+18m46s] ▶ Copying data folder for 2026-04-27
rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)
[2026-05-06 19:41:28] Archive DB size: 9.7G
[2026-05-06 19:41:28] Total time: 19m12s
[2026-05-06 19:41:28] Sync complete for 2026-04-27
[2026-05-06 19:41:28] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28
[2026-05-06 19:44:49] ========================================
[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28
[2026-05-06 19:44:49] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (9.7G)
Data dir: OK (223 files, 159M)
[+00m00s] ▶ Counting source rows for 2026-04-28
frames: 4535
elements: 407532
ui_events: 8621
ocr_text: 1623
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m00s
creating FTS tables ✓ 0m00s
[+00m02s] ▶ Syncing data for 2026-04-28
video_chunks ✓ 0m12s
frames (4535 rows) ✓ 1m30s
ocr_text (1623 rows) ✓ 0m32s
ui_events (8621 rows) ✓ 0m01s
elements (407532 rows) ✓ 1m02s
meetings (3 rows) ✓ 0m00s
[+03m19s] ▶ Updating FTS indexes
elements_fts ✓ 1m36s
frames_fts ✓ 2m28s
ui_events_fts ✓ 0m04s
[+07m27s] ▶ Verifying DB
frames: 4535 / 4535 ✓
elements: 407532 / 407532 ✓
ui_events: 8621 / 8621 ✓
ocr_text: 1623 / 1623 ✓
meetings: 3 / 3 ✓
[+08m59s] ▶ Copying data folder for 2026-04-28
rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)
[2026-05-06 19:54:08] Archive DB size: 10G
[2026-05-06 19:54:08] Total time: 9m19s
[2026-05-06 19:54:08] Sync complete for 2026-04-28
[2026-05-06 19:54:08] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll
total 24
drwx------ 9 lukas staff 288 28 Apr 09:18 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
drwx------ 5 lukas staff 160 1 Nov 2021 _cacache
drwx------@ 2 lukas staff 64 28 Apr 09:18 _locks
drwx------ 15 lukas staff 480 27 Apr 19:54 _logs
drwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx
-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked
-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json
-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 52920
drwx------+ 92 lukas staff 2944 6 May 20:22 .
drwxr-xr-x 5 root admin 160 23 Aug 2024 ..
-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding
-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store
drwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash
drwx------ 5 lukas staff 160 1 Nov 2021 .aws
-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json
-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history
-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc
drwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito
drwx------@ 6 lukas staff 192 9 Apr 19:53 .cache
drwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude
-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json
drwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium
drwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer
drwx------ 16 lukas staff 512 21 May 2025 .config
drwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue
drwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot
drwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor
drwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor
drwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona
drwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb
drwx------ 24 lukas staff 768 27 Apr 18:14 .docker
drwx------ 15 lukas staff 480 6 Jun 2023 .dropbox
drwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak
-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth
-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig
-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp
drwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon
drwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc
-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst
drwx------ 5 lukas staff 160 23 Dec 2024 .local
-rw------- 1 lukas staff 204 16 Mar 2024 .netrc
drwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp
-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history
-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer
drwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py
drwx------ 8 lukas staff 256 6 May 20:24 .npm
-rw------- 1 lukas staff 74 20 May 2024 .npmrc
drwx------ 32 lukas staff 1024 25 Jul 2025 .nvm
drwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile
-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history
drwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode
drwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight
drwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint
drwx------ 15 lukas staff 480 8 Aug 2025 .ssh
drwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit
drwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm
-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
UW PICO 5.09 New Buffer
[ Read 1 line ]
^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos
^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell
drwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm
drwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf
drwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn
-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc
-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile
-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy
-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave
-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save
-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees
-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc
drwx------@ 9 lukas staff 288 20 Apr 20:55 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV
drwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads
drwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen
drwx------@ 112 lukas staff 3584 2 Dec 09:19 Library
drwx------ 7 lukas staff 224 12 Feb 2024 Movies
drwx------+ 5 lukas staff 160 25 Sep 2023 Music
drwx------+ 9 lukas staff 288 25 Sep 2023 Pictures
drwx------ 3 lukas staff 96 8 Nov 2021 Postman
drwx------+ 4 lukas staff 128 28 Oct 2021 Public
-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf
drwx------ 4 lukas staff 128 2 Jul 2023 Users
-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log
-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log
-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4
-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 2025 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast
-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin
-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh
-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
cd: no such file or directory: /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated
checking permissions...
screen recording: ok
microphone: ok
accessibility: ok
2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap
2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update
2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits
2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown
2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export
2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary
2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ false │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 7 │
│ retention mode │ media-only (keep transcripts) │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ MacBook Pro Microphone (input) │
│ │ System Audio (output) │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: https://github.com/screenpipe/screenpipe/releases
2026-05-06T20:27:34.638384Z INFO screenpipe: starting UI event capture
2026-05-06T20:27:34.637679Z INFO screenpipe_core::pipes...
|
NULL
|
NULL
|
|
5
|
2
|
1
|
2026-05-06T17:28:11.264509+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778088491264_m2.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
-rw-r--r-- 1 lukas staff 1702453 28 Apr 17:23 -rw-r--r-- 1 lukas staff 1702453 28 Apr 17:23 compact_monitor_1_1777386198870.mp4
-rw-r--r-- 1 lukas staff 2034287 28 Apr 17:29 compact_monitor_1_1777386532344.mp4
-rw-r--r-- 1 lukas staff 1352893 28 Apr 17:34 compact_monitor_1_1777386875277.mp4
-rw-r--r-- 1 lukas staff 1873946 28 Apr 17:40 compact_monitor_1_1777387208685.mp4
-rw-r--r-- 1 lukas staff 1155463 28 Apr 17:45 compact_monitor_1_1777387548798.mp4
-rw-r--r-- 1 lukas staff 1428159 28 Apr 17:51 compact_monitor_1_1777387882691.mp4
-rw-r--r-- 1 lukas staff 1398484 28 Apr 17:56 compact_monitor_1_1777388213861.mp4
-rw-r--r-- 1 lukas staff 1688438 28 Apr 18:02 compact_monitor_1_1777388542869.mp4
-rw-r--r-- 1 lukas staff 2401161 28 Apr 18:07 compact_monitor_1_1777388869470.mp4
-rw-r--r-- 1 lukas staff 1283247 28 Apr 18:13 compact_monitor_1_1777389192202.mp4
-rw-r--r-- 1 lukas staff 1398160 28 Apr 18:18 compact_monitor_1_1777389525394.mp4
-rw-r--r-- 1 lukas staff 452906 28 Apr 18:24 compact_monitor_1_1777389856559.mp4
-rw-r--r-- 1 lukas staff 566518 28 Apr 18:29 compact_monitor_1_1777390191054.mp4
-rw-r--r-- 1 lukas staff 445894 28 Apr 18:35 compact_monitor_1_1777390513567.mp4
-rw-r--r-- 1 lukas staff 444044 28 Apr 18:40 compact_monitor_1_1777390841877.mp4
-rw-r--r-- 1 lukas staff 437853 28 Apr 18:46 compact_monitor_1_1777391162552.mp4
-rw-r--r-- 1 lukas staff 441008 28 Apr 18:51 compact_monitor_1_1777391489107.mp4
-rw-r--r-- 1 lukas staff 443934 28 Apr 18:57 compact_monitor_1_1777391823165.mp4
-rw-r--r-- 1 lukas staff 443624 28 Apr 19:02 compact_monitor_1_1777392146221.mp4
-rw-r--r-- 1 lukas staff 447164 28 Apr 19:07 compact_monitor_1_1777392469679.mp4
-rw-r--r-- 1 lukas staff 442431 28 Apr 19:13 compact_monitor_1_1777392792794.mp4
-rw-r--r-- 1 lukas staff 436805 28 Apr 19:18 compact_monitor_1_1777393109301.mp4
-rw-r--r-- 1 lukas staff 435633 28 Apr 19:23 compact_monitor_1_1777393423192.mp4
-rw-r--r-- 1 lukas staff 1162510 28 Apr 09:30 compact_monitor_2_1777357806702.mp4
-rw-r--r-- 1 lukas staff 3394878 28 Apr 09:35 compact_monitor_2_1777358126186.mp4
-rw-r--r-- 1 lukas staff 268044 28 Apr 09:40 compact_monitor_2_1777358443280.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 09:46 compact_monitor_2_1777358769231.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 09:51 compact_monitor_2_1777359084493.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 09:56 compact_monitor_2_1777359399758.mp4
-rw-r--r-- 1 lukas staff 266694 28 Apr 10:01 compact_monitor_2_1777359707884.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 10:06 compact_monitor_2_1777360016892.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 10:12 compact_monitor_2_1777360329199.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 10:17 compact_monitor_2_1777360641498.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 10:22 compact_monitor_2_1777360953971.mp4
-rw-r--r-- 1 lukas staff 267099 28 Apr 10:27 compact_monitor_2_1777361264266.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 10:33 compact_monitor_2_1777361583211.mp4
-rw-r--r-- 1 lukas staff 266829 28 Apr 10:38 compact_monitor_2_1777361903545.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 10:43 compact_monitor_2_1777362219032.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 10:48 compact_monitor_2_1777362532674.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 10:54 compact_monitor_2_1777362845950.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 10:59 compact_monitor_2_1777363157577.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 11:04 compact_monitor_2_1777363473776.mp4
-rw-r--r-- 1 lukas staff 267099 28 Apr 11:09 compact_monitor_2_1777363782342.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 11:14 compact_monitor_2_1777364092822.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 11:20 compact_monitor_2_1777364400840.mp4
-rw-r--r-- 1 lukas staff 266694 28 Apr 11:25 compact_monitor_2_1777364709144.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 11:30 compact_monitor_2_1777365022090.mp4
-rw-r--r-- 1 lukas staff 264669 28 Apr 11:35 compact_monitor_2_1777365335928.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 11:40 compact_monitor_2_1777365649137.mp4
-rw-r--r-- 1 lukas staff 266964 28 Apr 11:46 compact_monitor_2_1777365962619.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 11:51 compact_monitor_2_1777366273740.mp4
-rw-r--r-- 1 lukas staff 265209 28 Apr 11:56 compact_monitor_2_1777366582034.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 12:01 compact_monitor_2_1777366886631.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 12:06 compact_monitor_2_1777367202805.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 12:11 compact_monitor_2_1777367518861.mp4
-rw-r--r-- 1 lukas staff 269261 28 Apr 12:17 compact_monitor_2_1777367837441.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 12:22 compact_monitor_2_1777368160952.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 12:28 compact_monitor_2_1777368477571.mp4
-rw-r--r-- 1 lukas staff 267234 28 Apr 12:33 compact_monitor_2_1777368792600.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 12:38 compact_monitor_2_1777369107069.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 12:43 compact_monitor_2_1777369421530.mp4
-rw-r--r-- 1 lukas staff 266829 28 Apr 12:48 compact_monitor_2_1777369731189.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 12:54 compact_monitor_2_1777370048214.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 12:59 compact_monitor_2_1777370363567.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 13:04 compact_monitor_2_1777370679314.mp4
-rw-r--r-- 1 lukas staff 268855 28 Apr 13:09 compact_monitor_2_1777370994284.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 13:15 compact_monitor_2_1777371309064.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 13:20 compact_monitor_2_1777371623643.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 13:25 compact_monitor_2_1777371938006.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 13:30 compact_monitor_2_1777372252120.mp4
-rw-r--r-- 1 lukas staff 266964 28 Apr 13:36 compact_monitor_2_1777372566394.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 13:41 compact_monitor_2_1777372880197.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 13:46 compact_monitor_2_1777373193667.mp4
-rw-r--r-- 1 lukas staff 265209 28 Apr 13:51 compact_monitor_2_1777373506832.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 13:56 compact_monitor_2_1777373816197.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 14:02 compact_monitor_2_1777374130774.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 14:07 compact_monitor_2_1777374443527.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 14:12 compact_monitor_2_1777374756405.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 14:17 compact_monitor_2_1777375070551.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 14:23 compact_monitor_2_1777375397987.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 14:28 compact_monitor_2_1777375715930.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 14:33 compact_monitor_2_1777376034152.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 14:39 compact_monitor_2_1777376348246.mp4
-rw-r--r-- 1 lukas staff 266019 28 Apr 14:44 compact_monitor_2_1777376657026.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 14:49 compact_monitor_2_1777376966683.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 14:54 compact_monitor_2_1777377280571.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:00 compact_monitor_2_1777377602616.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:05 compact_monitor_2_1777377915467.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 15:10 compact_monitor_2_1777378232424.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 15:15 compact_monitor_2_1777378547117.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:21 compact_monitor_2_1777378865359.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 15:26 compact_monitor_2_1777379183376.mp4
-rw-r--r-- 1 lukas staff 267774 28 Apr 15:31 compact_monitor_2_1777379502714.mp4
-rw-r--r-- 1 lukas staff 268046 28 Apr 15:37 compact_monitor_2_1777379819259.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 15:42 compact_monitor_2_1777380134674.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 15:47 compact_monitor_2_1777380454708.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 15:52 compact_monitor_2_1777380771150.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 15:58 compact_monitor_2_1777381086934.mp4
-rw-r--r-- 1 lukas staff 268044 28 Apr 16:03 compact_monitor_2_1777381401816.mp4
-rw-r--r-- 1 lukas staff 269530 28 Apr 16:08 compact_monitor_2_1777381720100.mp4
-rw-r--r-- 1 lukas staff 268721 28 Apr 16:13 compact_monitor_2_1777382037168.mp4
-rw-r--r-- 1 lukas staff 268583 28 Apr 16:19 compact_monitor_2_1777382355014.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 16:24 compact_monitor_2_1777382670965.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 16:29 compact_monitor_2_1777382984987.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 16:34 compact_monitor_2_1777383298084.mp4
-rw-r--r-- 1 lukas staff 236209 28 Apr 16:40 compact_monitor_2_1777383610070.mp4
-rw-r--r-- 1 lukas staff 1191690 28 Apr 17:01 compact_monitor_2_1777384877981.mp4
-rw-r--r-- 1 lukas staff 2975861 28 Apr 17:06 compact_monitor_2_1777385201736.mp4
-rw-r--r-- 1 lukas staff 5319560 28 Apr 17:12 compact_monitor_2_1777385529432.mp4
-rw-r--r-- 1 lukas staff 3006284 28 Apr 17:18 compact_monitor_2_1777385870812.mp4
-rw-r--r-- 1 lukas staff 2726877 28 Apr 17:23 compact_monitor_2_1777386204715.mp4
-rw-r--r-- 1 lukas staff 3315722 28 Apr 17:29 compact_monitor_2_1777386541280.mp4
-rw-r--r-- 1 lukas staff 1577465 28 Apr 17:34 compact_monitor_2_1777386883461.mp4
-rw-r--r-- 1 lukas staff 1745214 28 Apr 17:40 compact_monitor_2_1777387214543.mp4
-rw-r--r-- 1 lukas staff 950993 28 Apr 17:45 compact_monitor_2_1777387552842.mp4
-rw-r--r-- 1 lukas staff 429007 28 Apr 17:51 compact_monitor_2_1777387889075.mp4
-rw-r--r-- 1 lukas staff 884099 28 Apr 17:57 compact_monitor_2_1777388218623.mp4
-rw-r--r-- 1 lukas staff 2352504 28 Apr 18:02 compact_monitor_2_1777388548021.mp4
-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4
-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4
-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4
-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4
-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4
-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4
-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4
-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4
-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4
-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4
-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4
-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4
-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4
-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4
-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22523176
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 28 Apr 16:51 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite
-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm
-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 18:58:18] ========================================
[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27
[2026-05-06 18:58:18] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m04s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m06s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m07s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)
frames (7543 rows) ⠴ %
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 19:22:16] ========================================
[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27
[2026-05-06 19:22:16] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m01s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m03s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ✓ 4m40s
ocr_text (2193 rows) ✓ 0m25s
ui_events (9909 rows) ✓ 0m02s
elements (470235 rows) ✓ 2m46s
meetings (3 rows) ✓ 0m00s
[+08m07s] ▶ Updating FTS indexes
elements_fts ✓ 2m59s
frames_fts ✓ 6m07s
ui_events_fts ✓ 0m03s
[+17m16s] ▶ Verifying DB
frames: 7543 / 7543 ✓
elements: 470235 / 470235 ✓
ui_events: 9909 / 9909 ✓
ocr_text: 2193 / 2193 ✓
meetings: 3 / 3 ✓
[+18m46s] ▶ Copying data folder for 2026-04-27
rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)
[2026-05-06 19:41:28] Archive DB size: 9.7G
[2026-05-06 19:41:28] Total time: 19m12s
[2026-05-06 19:41:28] Sync complete for 2026-04-27
[2026-05-06 19:41:28] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28
[2026-05-06 19:44:49] ========================================
[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28
[2026-05-06 19:44:49] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (9.7G)
Data dir: OK (223 files, 159M)
[+00m00s] ▶ Counting source rows for 2026-04-28
frames: 4535
elements: 407532
ui_events: 8621
ocr_text: 1623
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m00s
creating FTS tables ✓ 0m00s
[+00m02s] ▶ Syncing data for 2026-04-28
video_chunks ✓ 0m12s
frames (4535 rows) ✓ 1m30s
ocr_text (1623 rows) ✓ 0m32s
ui_events (8621 rows) ✓ 0m01s
elements (407532 rows) ✓ 1m02s
meetings (3 rows) ✓ 0m00s
[+03m19s] ▶ Updating FTS indexes
elements_fts ✓ 1m36s
frames_fts ✓ 2m28s
ui_events_fts ✓ 0m04s
[+07m27s] ▶ Verifying DB
frames: 4535 / 4535 ✓
elements: 407532 / 407532 ✓
ui_events: 8621 / 8621 ✓
ocr_text: 1623 / 1623 ✓
meetings: 3 / 3 ✓
[+08m59s] ▶ Copying data folder for 2026-04-28
rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)
[2026-05-06 19:54:08] Archive DB size: 10G
[2026-05-06 19:54:08] Total time: 9m19s
[2026-05-06 19:54:08] Sync complete for 2026-04-28
[2026-05-06 19:54:08] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll
total 24
drwx------ 9 lukas staff 288 28 Apr 09:18 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
drwx------ 5 lukas staff 160 1 Nov 2021 _cacache
drwx------@ 2 lukas staff 64 28 Apr 09:18 _locks
drwx------ 15 lukas staff 480 27 Apr 19:54 _logs
drwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx
-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked
-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json
-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 52920
drwx------+ 92 lukas staff 2944 6 May 20:22 .
drwxr-xr-x 5 root admin 160 23 Aug 2024 ..
-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding
-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store
drwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash
drwx------ 5 lukas staff 160 1 Nov 2021 .aws
-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json
-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history
-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc
drwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito
drwx------@ 6 lukas staff 192 9 Apr 19:53 .cache
drwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude
-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json
drwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium
drwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer
drwx------ 16 lukas staff 512 21 May 2025 .config
drwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue
drwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot
drwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor
drwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor
drwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona
drwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb
drwx------ 24 lukas staff 768 27 Apr 18:14 .docker
drwx------ 15 lukas staff 480 6 Jun 2023 .dropbox
drwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak
-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth
-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig
-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp
drwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon
drwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc
-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst
drwx------ 5 lukas staff 160 23 Dec 2024 .local
-rw------- 1 lukas staff 204 16 Mar 2024 .netrc
drwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp
-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history
-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer
drwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py
drwx------ 8 lukas staff 256 6 May 20:24 .npm
-rw------- 1 lukas staff 74 20 May 2024 .npmrc
drwx------ 32 lukas staff 1024 25 Jul 2025 .nvm
drwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile
-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history
drwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode
drwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight
drwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint
drwx------ 15 lukas staff 480 8 Aug 2025 .ssh
drwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit
drwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm
-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
UW PICO 5.09 New Buffer
[ Read 1 line ]
^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos
^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell
drwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm
drwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf
drwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn
-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc
-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile
-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy
-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave
-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save
-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees
-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc
drwx------@ 9 lukas staff 288 20 Apr 20:55 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV
drwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads
drwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen
drwx------@ 112 lukas staff 3584 2 Dec 09:19 Library
drwx------ 7 lukas staff 224 12 Feb 2024 Movies
drwx------+ 5 lukas staff 160 25 Sep 2023 Music
drwx------+ 9 lukas staff 288 25 Sep 2023 Pictures
drwx------ 3 lukas staff 96 8 Nov 2021 Postman
drwx------+ 4 lukas staff 128 28 Oct 2021 Public
-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf
drwx------ 4 lukas staff 128 2 Jul 2023 Users
-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log
-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log
-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4
-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 2025 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast
-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin
-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh
-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
cd: no such file or directory: /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated
checking permissions...
screen recording: ok
microphone: ok
accessibility: ok
2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap
2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update
2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits
2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown
2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export
2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary
2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ false │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 7 │
│ retention mode │ media-only (keep transcripts) │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ MacBook Pro Microphone (input) │
│ │ System Audio (output) │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: https://github.com/screenpipe/screenpipe/releases
2026-05-06T20:27:34.638384Z INFO screenpipe: starting UI event capture
2026-05-06T20:27:34.637679Z INFO screenpipe_core::pipes...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"-rw-r--r-- 1 lukas staff 1702453 28 Apr 17:23 compact_monitor_1_1777386198870.mp4\n-rw-r--r-- 1 lukas staff 2034287 28 Apr 17:29 compact_monitor_1_1777386532344.mp4\n-rw-r--r-- 1 lukas staff 1352893 28 Apr 17:34 compact_monitor_1_1777386875277.mp4\n-rw-r--r-- 1 lukas staff 1873946 28 Apr 17:40 compact_monitor_1_1777387208685.mp4\n-rw-r--r-- 1 lukas staff 1155463 28 Apr 17:45 compact_monitor_1_1777387548798.mp4\n-rw-r--r-- 1 lukas staff 1428159 28 Apr 17:51 compact_monitor_1_1777387882691.mp4\n-rw-r--r-- 1 lukas staff 1398484 28 Apr 17:56 compact_monitor_1_1777388213861.mp4\n-rw-r--r-- 1 lukas staff 1688438 28 Apr 18:02 compact_monitor_1_1777388542869.mp4\n-rw-r--r-- 1 lukas staff 2401161 28 Apr 18:07 compact_monitor_1_1777388869470.mp4\n-rw-r--r-- 1 lukas staff 1283247 28 Apr 18:13 compact_monitor_1_1777389192202.mp4\n-rw-r--r-- 1 lukas staff 1398160 28 Apr 18:18 compact_monitor_1_1777389525394.mp4\n-rw-r--r-- 1 lukas staff 452906 28 Apr 18:24 compact_monitor_1_1777389856559.mp4\n-rw-r--r-- 1 lukas staff 566518 28 Apr 18:29 compact_monitor_1_1777390191054.mp4\n-rw-r--r-- 1 lukas staff 445894 28 Apr 18:35 compact_monitor_1_1777390513567.mp4\n-rw-r--r-- 1 lukas staff 444044 28 Apr 18:40 compact_monitor_1_1777390841877.mp4\n-rw-r--r-- 1 lukas staff 437853 28 Apr 18:46 compact_monitor_1_1777391162552.mp4\n-rw-r--r-- 1 lukas staff 441008 28 Apr 18:51 compact_monitor_1_1777391489107.mp4\n-rw-r--r-- 1 lukas staff 443934 28 Apr 18:57 compact_monitor_1_1777391823165.mp4\n-rw-r--r-- 1 lukas staff 443624 28 Apr 19:02 compact_monitor_1_1777392146221.mp4\n-rw-r--r-- 1 lukas staff 447164 28 Apr 19:07 compact_monitor_1_1777392469679.mp4\n-rw-r--r-- 1 lukas staff 442431 28 Apr 19:13 compact_monitor_1_1777392792794.mp4\n-rw-r--r-- 1 lukas staff 436805 28 Apr 19:18 compact_monitor_1_1777393109301.mp4\n-rw-r--r-- 1 lukas staff 435633 28 Apr 19:23 compact_monitor_1_1777393423192.mp4\n-rw-r--r-- 1 lukas staff 1162510 28 Apr 09:30 compact_monitor_2_1777357806702.mp4\n-rw-r--r-- 1 lukas staff 3394878 28 Apr 09:35 compact_monitor_2_1777358126186.mp4\n-rw-r--r-- 1 lukas staff 268044 28 Apr 09:40 compact_monitor_2_1777358443280.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 09:46 compact_monitor_2_1777358769231.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 09:51 compact_monitor_2_1777359084493.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 09:56 compact_monitor_2_1777359399758.mp4\n-rw-r--r-- 1 lukas staff 266694 28 Apr 10:01 compact_monitor_2_1777359707884.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 10:06 compact_monitor_2_1777360016892.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 10:12 compact_monitor_2_1777360329199.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 10:17 compact_monitor_2_1777360641498.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 10:22 compact_monitor_2_1777360953971.mp4\n-rw-r--r-- 1 lukas staff 267099 28 Apr 10:27 compact_monitor_2_1777361264266.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 10:33 compact_monitor_2_1777361583211.mp4\n-rw-r--r-- 1 lukas staff 266829 28 Apr 10:38 compact_monitor_2_1777361903545.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 10:43 compact_monitor_2_1777362219032.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 10:48 compact_monitor_2_1777362532674.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 10:54 compact_monitor_2_1777362845950.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 10:59 compact_monitor_2_1777363157577.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 11:04 compact_monitor_2_1777363473776.mp4\n-rw-r--r-- 1 lukas staff 267099 28 Apr 11:09 compact_monitor_2_1777363782342.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 11:14 compact_monitor_2_1777364092822.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 11:20 compact_monitor_2_1777364400840.mp4\n-rw-r--r-- 1 lukas staff 266694 28 Apr 11:25 compact_monitor_2_1777364709144.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 11:30 compact_monitor_2_1777365022090.mp4\n-rw-r--r-- 1 lukas staff 264669 28 Apr 11:35 compact_monitor_2_1777365335928.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 11:40 compact_monitor_2_1777365649137.mp4\n-rw-r--r-- 1 lukas staff 266964 28 Apr 11:46 compact_monitor_2_1777365962619.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 11:51 compact_monitor_2_1777366273740.mp4\n-rw-r--r-- 1 lukas staff 265209 28 Apr 11:56 compact_monitor_2_1777366582034.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 12:01 compact_monitor_2_1777366886631.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 12:06 compact_monitor_2_1777367202805.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 12:11 compact_monitor_2_1777367518861.mp4\n-rw-r--r-- 1 lukas staff 269261 28 Apr 12:17 compact_monitor_2_1777367837441.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 12:22 compact_monitor_2_1777368160952.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 12:28 compact_monitor_2_1777368477571.mp4\n-rw-r--r-- 1 lukas staff 267234 28 Apr 12:33 compact_monitor_2_1777368792600.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 12:38 compact_monitor_2_1777369107069.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 12:43 compact_monitor_2_1777369421530.mp4\n-rw-r--r-- 1 lukas staff 266829 28 Apr 12:48 compact_monitor_2_1777369731189.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 12:54 compact_monitor_2_1777370048214.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 12:59 compact_monitor_2_1777370363567.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 13:04 compact_monitor_2_1777370679314.mp4\n-rw-r--r-- 1 lukas staff 268855 28 Apr 13:09 compact_monitor_2_1777370994284.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 13:15 compact_monitor_2_1777371309064.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 13:20 compact_monitor_2_1777371623643.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 13:25 compact_monitor_2_1777371938006.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 13:30 compact_monitor_2_1777372252120.mp4\n-rw-r--r-- 1 lukas staff 266964 28 Apr 13:36 compact_monitor_2_1777372566394.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 13:41 compact_monitor_2_1777372880197.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 13:46 compact_monitor_2_1777373193667.mp4\n-rw-r--r-- 1 lukas staff 265209 28 Apr 13:51 compact_monitor_2_1777373506832.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 13:56 compact_monitor_2_1777373816197.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 14:02 compact_monitor_2_1777374130774.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 14:07 compact_monitor_2_1777374443527.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 14:12 compact_monitor_2_1777374756405.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 14:17 compact_monitor_2_1777375070551.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 14:23 compact_monitor_2_1777375397987.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 14:28 compact_monitor_2_1777375715930.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 14:33 compact_monitor_2_1777376034152.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 14:39 compact_monitor_2_1777376348246.mp4\n-rw-r--r-- 1 lukas staff 266019 28 Apr 14:44 compact_monitor_2_1777376657026.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 14:49 compact_monitor_2_1777376966683.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 14:54 compact_monitor_2_1777377280571.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:00 compact_monitor_2_1777377602616.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:05 compact_monitor_2_1777377915467.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 15:10 compact_monitor_2_1777378232424.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 15:15 compact_monitor_2_1777378547117.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:21 compact_monitor_2_1777378865359.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 15:26 compact_monitor_2_1777379183376.mp4\n-rw-r--r-- 1 lukas staff 267774 28 Apr 15:31 compact_monitor_2_1777379502714.mp4\n-rw-r--r-- 1 lukas staff 268046 28 Apr 15:37 compact_monitor_2_1777379819259.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 15:42 compact_monitor_2_1777380134674.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 15:47 compact_monitor_2_1777380454708.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 15:52 compact_monitor_2_1777380771150.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 15:58 compact_monitor_2_1777381086934.mp4\n-rw-r--r-- 1 lukas staff 268044 28 Apr 16:03 compact_monitor_2_1777381401816.mp4\n-rw-r--r-- 1 lukas staff 269530 28 Apr 16:08 compact_monitor_2_1777381720100.mp4\n-rw-r--r-- 1 lukas staff 268721 28 Apr 16:13 compact_monitor_2_1777382037168.mp4\n-rw-r--r-- 1 lukas staff 268583 28 Apr 16:19 compact_monitor_2_1777382355014.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 16:24 compact_monitor_2_1777382670965.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 16:29 compact_monitor_2_1777382984987.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 16:34 compact_monitor_2_1777383298084.mp4\n-rw-r--r-- 1 lukas staff 236209 28 Apr 16:40 compact_monitor_2_1777383610070.mp4\n-rw-r--r-- 1 lukas staff 1191690 28 Apr 17:01 compact_monitor_2_1777384877981.mp4\n-rw-r--r-- 1 lukas staff 2975861 28 Apr 17:06 compact_monitor_2_1777385201736.mp4\n-rw-r--r-- 1 lukas staff 5319560 28 Apr 17:12 compact_monitor_2_1777385529432.mp4\n-rw-r--r-- 1 lukas staff 3006284 28 Apr 17:18 compact_monitor_2_1777385870812.mp4\n-rw-r--r-- 1 lukas staff 2726877 28 Apr 17:23 compact_monitor_2_1777386204715.mp4\n-rw-r--r-- 1 lukas staff 3315722 28 Apr 17:29 compact_monitor_2_1777386541280.mp4\n-rw-r--r-- 1 lukas staff 1577465 28 Apr 17:34 compact_monitor_2_1777386883461.mp4\n-rw-r--r-- 1 lukas staff 1745214 28 Apr 17:40 compact_monitor_2_1777387214543.mp4\n-rw-r--r-- 1 lukas staff 950993 28 Apr 17:45 compact_monitor_2_1777387552842.mp4\n-rw-r--r-- 1 lukas staff 429007 28 Apr 17:51 compact_monitor_2_1777387889075.mp4\n-rw-r--r-- 1 lukas staff 884099 28 Apr 17:57 compact_monitor_2_1777388218623.mp4\n-rw-r--r-- 1 lukas staff 2352504 28 Apr 18:02 compact_monitor_2_1777388548021.mp4\n-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4\n-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4\n-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4\n-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4\n-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4\n-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4\n-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4\n-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4\n-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4\n-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4\n-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4\n-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4\n-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4\n-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4\n-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22523176\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 28 Apr 16:51 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite\n-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27 \n[2026-05-06 18:58:18] ========================================\n[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 18:58:18] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m04s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m06s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m07s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)\n frames (7543 rows) ⠴ % \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27\n[2026-05-06 19:22:16] ========================================\n[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 19:22:16] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m01s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m03s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ✓ 4m40s\n ocr_text (2193 rows) ✓ 0m25s\n ui_events (9909 rows) ✓ 0m02s\n elements (470235 rows) ✓ 2m46s\n meetings (3 rows) ✓ 0m00s\n\n[+08m07s] ▶ Updating FTS indexes\n elements_fts ✓ 2m59s\n frames_fts ✓ 6m07s\n ui_events_fts ✓ 0m03s\n\n[+17m16s] ▶ Verifying DB\n frames: 7543 / 7543 ✓\n elements: 470235 / 470235 ✓\n ui_events: 9909 / 9909 ✓\n ocr_text: 2193 / 2193 ✓\n meetings: 3 / 3 ✓\n\n[+18m46s] ▶ Copying data folder for 2026-04-27\n rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)\n\n[2026-05-06 19:41:28] Archive DB size: 9.7G\n[2026-05-06 19:41:28] Total time: 19m12s\n[2026-05-06 19:41:28] Sync complete for 2026-04-27\n[2026-05-06 19:41:28] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28\n[2026-05-06 19:44:49] ========================================\n[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28\n[2026-05-06 19:44:49] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (9.7G)\n Data dir: OK (223 files, 159M)\n\n[+00m00s] ▶ Counting source rows for 2026-04-28\n frames: 4535\n elements: 407532\n ui_events: 8621\n ocr_text: 1623\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m00s\n creating FTS tables ✓ 0m00s\n\n[+00m02s] ▶ Syncing data for 2026-04-28\n video_chunks ✓ 0m12s\n frames (4535 rows) ✓ 1m30s\n ocr_text (1623 rows) ✓ 0m32s\n ui_events (8621 rows) ✓ 0m01s\n elements (407532 rows) ✓ 1m02s\n meetings (3 rows) ✓ 0m00s\n\n[+03m19s] ▶ Updating FTS indexes\n elements_fts ✓ 1m36s\n frames_fts ✓ 2m28s\n ui_events_fts ✓ 0m04s\n\n[+07m27s] ▶ Verifying DB\n frames: 4535 / 4535 ✓\n elements: 407532 / 407532 ✓\n ui_events: 8621 / 8621 ✓\n ocr_text: 1623 / 1623 ✓\n meetings: 3 / 3 ✓\n\n[+08m59s] ▶ Copying data folder for 2026-04-28\n rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)\n\n[2026-05-06 19:54:08] Archive DB size: 10G\n[2026-05-06 19:54:08] Total time: 9m19s\n[2026-05-06 19:54:08] Sync complete for 2026-04-28\n[2026-05-06 19:54:08] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll\ntotal 24\ndrwx------ 9 lukas staff 288 28 Apr 09:18 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\ndrwx------ 5 lukas staff 160 1 Nov 2021 _cacache\ndrwx------@ 2 lukas staff 64 28 Apr 09:18 _locks\ndrwx------ 15 lukas staff 480 27 Apr 19:54 _logs\ndrwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx\n-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked\n-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json\n-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll \ntotal 52920\ndrwx------+ 92 lukas staff 2944 6 May 20:22 .\ndrwxr-xr-x 5 root admin 160 23 Aug 2024 ..\n-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding\n-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store\ndrwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash\ndrwx------ 5 lukas staff 160 1 Nov 2021 .aws\n-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json\n-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history\n-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc\ndrwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito\ndrwx------@ 6 lukas staff 192 9 Apr 19:53 .cache\ndrwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude\n-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json\ndrwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium\ndrwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer\ndrwx------ 16 lukas staff 512 21 May 2025 .config\ndrwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue\ndrwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot\ndrwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor\ndrwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor\ndrwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona\ndrwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb\ndrwx------ 24 lukas staff 768 27 Apr 18:14 .docker\ndrwx------ 15 lukas staff 480 6 Jun 2023 .dropbox\ndrwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak\n-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth\n-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig\n-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp\ndrwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon\ndrwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc\n-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst\ndrwx------ 5 lukas staff 160 23 Dec 2024 .local\n-rw------- 1 lukas staff 204 16 Mar 2024 .netrc\ndrwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp\n-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history\n-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer\ndrwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py\ndrwx------ 8 lukas staff 256 6 May 20:24 .npm\n-rw------- 1 lukas staff 74 20 May 2024 .npmrc\ndrwx------ 32 lukas staff 1024 25 Jul 2025 .nvm\ndrwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile\n-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history\ndrwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode\ndrwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight\ndrwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint\ndrwx------ 15 lukas staff 480 8 Aug 2025 .ssh\ndrwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit\ndrwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm\n-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\n UW PICO 5.09 New Buffer \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n [ Read 1 line ] \n^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos \n^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell \ndrwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm\ndrwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf\ndrwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn\n-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc\n-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile\n-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy\n-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave\n-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save\n-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees\n-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc\ndrwx------@ 9 lukas staff 288 20 Apr 20:55 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV\ndrwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads\ndrwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen\ndrwx------@ 112 lukas staff 3584 2 Dec 09:19 Library\ndrwx------ 7 lukas staff 224 12 Feb 2024 Movies\ndrwx------+ 5 lukas staff 160 25 Sep 2023 Music\ndrwx------+ 9 lukas staff 288 25 Sep 2023 Pictures\ndrwx------ 3 lukas staff 96 8 Nov 2021 Postman\ndrwx------+ 4 lukas staff 128 28 Oct 2021 Public\n-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf\ndrwx------ 4 lukas staff 128 2 Jul 2023 Users\n-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log\n-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 2025 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast\n-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin\n-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh\n-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe\ncd: no such file or directory: /Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated\nchecking permissions...\n screen recording: ok\n microphone: ok\n accessibility: ok\n2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap\n2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update\n2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits\n2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown\n2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export\n2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary\n2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ false │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n│ retention mode │ media-only (keep transcripts) │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ MacBook Pro Microphone (input) │\n│ │ System Audio (output) │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-05-06T20:27:34.638384Z INFO screenpipe: starting UI event capture\n2026-05-06T20:27:34.637679Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-05-06T20:27:34.649154Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(94))\n2026-05-06T20:27:34.652794Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-05-06T20:27:34.655839Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-05-06T20:27:34.673877Z INFO screenpipe_engine::ui_recorder: UI recording session started: 54869993-7b4b-491f-b717-2a583517f9c5\n2026-05-06T20:27:34.673910Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-05-06T20:27:34.674057Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-05-05 17:27:34.674056 UTC to 2026-05-06 17:27:34.674056 UTC)\n2026-05-06T20:27:34.674892Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-05-06T20:27:34.675788Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 0 frame entries, coverage from 2026-05-05 17:27:34.674056 UTC\n2026-05-06T20:27:34.686546Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-05-06T20:27:34.691371Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-05-06T20:27:36.270608Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-05-06T20:27:36.270669Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.270714Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.932583Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-05-06T20:27:36.932852Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-05-06T20:27:36.932882Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-05-06T20:27:36.932899Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-05-06T20:27:36.932901Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-05-06T20:27:39.158281Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 3 excluded)\n2026-05-06T20:27:39.593177Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1, dur=101ms\n2026-05-06T20:27:40.672366Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)\n2026-05-06T20:27:41.257664Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=2, dur=140ms\n2026-05-06T20:27:44.641022Z INFO screenpipe_audio::transcription::engine: whisper model available: \"/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin\"\n2026-05-06T20:27:44.641079Z INFO screenpipe_audio::transcription::whisper::model: whisper context: gpu acceleration enabled (Metal on macOS, Vulkan on Windows)\n2026-05-06T20:27:44.641086Z INFO screenpipe_audio::transcription::engine: loading whisper model with GPU acceleration...\nwhisper_init_from_file_with_params_no_state: loading model from '/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin'\nwhisper_init_with_params_no_state: use gpu = 1\nwhisper_init_with_params_no_state: flash attn = 0\nwhisper_init_with_params_no_state: gpu_device = 0\nwhisper_init_with_params_no_state: dtw = 0\nggml_metal_device_init: tensor API disabled for pre-M5 and pre-A19 devices\nggml_metal_library_init: using embedded metal library\nggml_metal_library_init: loaded in 0.041 sec\nggml_metal_rsets_init: creating a residency set collection (keep_alive = 180 s)\nggml_metal_device_init: GPU name: Apple M1\nggml_metal_device_init: GPU family: MTLGPUFamilyApple7 (1007)\nggml_metal_device_init: GPU family: MTLGPUFamilyCommon3 (3003)\nggml_metal_device_init: GPU family: MTLGPUFamilyMetal3 (5001)\nggml_metal_device_init: simdgroup reduction = true\nggml_metal_device_init: simdgroup matrix mul. = true\nggml_metal_device_init: has unified memory = true\nggml_metal_device_init: has bfloat = true\nggml_metal_device_init: has tensor = false\nggml_metal_device_init: use residency sets = true\nggml_metal_device_init: use shared buffers = true\nggml_metal_device_init: recommendedMaxWorkingSetSize = 11453.25 MB\nwhisper_init_with_params_no_state: devices = 3\nwhisper_init_with_params_no_state: backends = 3\nwhisper_model_load: loading model\nwhisper_model_load: n_vocab = 51865\nwhisper_model_load: n_audio_ctx = 1500\nwhisper_model_load: n_audio_state = 384\nwhisper_model_load: n_audio_head = 6\nwhisper_model_load: n_audio_layer = 4\nwhisper_model_load: n_text_ctx = 448\nwhisper_model_load: n_text_state = 384\nwhisper_model_load: n_text_head = 6\nwhisper_model_load: n_text_layer = 4\nwhisper_model_load: n_mels = 80\nwhisper_model_load: ftype = 1\nwhisper_model_load: qntvr = 0\nwhisper_model_load: type = 1 (tiny)\nwhisper_model_load: adding 1608 extra tokens\nwhisper_model_load: n_langs = 99\nwhisper_model_load: Metal total size = 77.11 MB\nwhisper_model_load: model size = 77.11 MB\n2026-05-06T20:27:44.857210Z INFO screenpipe_audio::transcription::engine: whisper model loaded successfully\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\n2026-05-06T20:27:44.861912Z INFO screenpipe_audio::audio_manager::manager: transcription session created (will be reused across segments)\n2026-05-06T20:27:44.862480Z INFO screenpipe_audio::audio_manager::manager: audio manager started\n2026-05-06T20:27:44.862525Z INFO screenpipe_audio::audio_manager::manager: calendar-assisted speaker diarization: listening for meeting events\n2026-05-06T20:27:47.831980Z INFO screenpipe_audio::device::device_manager: starting recording for device: System Audio (output)\n2026-05-06T20:27:47.832191Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for System Audio (output) (unknown / 30s segments)\n2026-05-06T20:27:47.906029Z INFO screenpipe_audio::device::device_manager: starting recording for device: MacBook Pro Microphone (input)\n2026-05-06T20:27:47.906090Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for MacBook Pro Microphone (input) (wired / 30s segments)","depth":4,"on_screen":true,"value":"-rw-r--r-- 1 lukas staff 1702453 28 Apr 17:23 compact_monitor_1_1777386198870.mp4\n-rw-r--r-- 1 lukas staff 2034287 28 Apr 17:29 compact_monitor_1_1777386532344.mp4\n-rw-r--r-- 1 lukas staff 1352893 28 Apr 17:34 compact_monitor_1_1777386875277.mp4\n-rw-r--r-- 1 lukas staff 1873946 28 Apr 17:40 compact_monitor_1_1777387208685.mp4\n-rw-r--r-- 1 lukas staff 1155463 28 Apr 17:45 compact_monitor_1_1777387548798.mp4\n-rw-r--r-- 1 lukas staff 1428159 28 Apr 17:51 compact_monitor_1_1777387882691.mp4\n-rw-r--r-- 1 lukas staff 1398484 28 Apr 17:56 compact_monitor_1_1777388213861.mp4\n-rw-r--r-- 1 lukas staff 1688438 28 Apr 18:02 compact_monitor_1_1777388542869.mp4\n-rw-r--r-- 1 lukas staff 2401161 28 Apr 18:07 compact_monitor_1_1777388869470.mp4\n-rw-r--r-- 1 lukas staff 1283247 28 Apr 18:13 compact_monitor_1_1777389192202.mp4\n-rw-r--r-- 1 lukas staff 1398160 28 Apr 18:18 compact_monitor_1_1777389525394.mp4\n-rw-r--r-- 1 lukas staff 452906 28 Apr 18:24 compact_monitor_1_1777389856559.mp4\n-rw-r--r-- 1 lukas staff 566518 28 Apr 18:29 compact_monitor_1_1777390191054.mp4\n-rw-r--r-- 1 lukas staff 445894 28 Apr 18:35 compact_monitor_1_1777390513567.mp4\n-rw-r--r-- 1 lukas staff 444044 28 Apr 18:40 compact_monitor_1_1777390841877.mp4\n-rw-r--r-- 1 lukas staff 437853 28 Apr 18:46 compact_monitor_1_1777391162552.mp4\n-rw-r--r-- 1 lukas staff 441008 28 Apr 18:51 compact_monitor_1_1777391489107.mp4\n-rw-r--r-- 1 lukas staff 443934 28 Apr 18:57 compact_monitor_1_1777391823165.mp4\n-rw-r--r-- 1 lukas staff 443624 28 Apr 19:02 compact_monitor_1_1777392146221.mp4\n-rw-r--r-- 1 lukas staff 447164 28 Apr 19:07 compact_monitor_1_1777392469679.mp4\n-rw-r--r-- 1 lukas staff 442431 28 Apr 19:13 compact_monitor_1_1777392792794.mp4\n-rw-r--r-- 1 lukas staff 436805 28 Apr 19:18 compact_monitor_1_1777393109301.mp4\n-rw-r--r-- 1 lukas staff 435633 28 Apr 19:23 compact_monitor_1_1777393423192.mp4\n-rw-r--r-- 1 lukas staff 1162510 28 Apr 09:30 compact_monitor_2_1777357806702.mp4\n-rw-r--r-- 1 lukas staff 3394878 28 Apr 09:35 compact_monitor_2_1777358126186.mp4\n-rw-r--r-- 1 lukas staff 268044 28 Apr 09:40 compact_monitor_2_1777358443280.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 09:46 compact_monitor_2_1777358769231.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 09:51 compact_monitor_2_1777359084493.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 09:56 compact_monitor_2_1777359399758.mp4\n-rw-r--r-- 1 lukas staff 266694 28 Apr 10:01 compact_monitor_2_1777359707884.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 10:06 compact_monitor_2_1777360016892.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 10:12 compact_monitor_2_1777360329199.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 10:17 compact_monitor_2_1777360641498.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 10:22 compact_monitor_2_1777360953971.mp4\n-rw-r--r-- 1 lukas staff 267099 28 Apr 10:27 compact_monitor_2_1777361264266.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 10:33 compact_monitor_2_1777361583211.mp4\n-rw-r--r-- 1 lukas staff 266829 28 Apr 10:38 compact_monitor_2_1777361903545.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 10:43 compact_monitor_2_1777362219032.mp4\n-rw-r--r-- 1 lukas staff 265614 28 Apr 10:48 compact_monitor_2_1777362532674.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 10:54 compact_monitor_2_1777362845950.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 10:59 compact_monitor_2_1777363157577.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 11:04 compact_monitor_2_1777363473776.mp4\n-rw-r--r-- 1 lukas staff 267099 28 Apr 11:09 compact_monitor_2_1777363782342.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 11:14 compact_monitor_2_1777364092822.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 11:20 compact_monitor_2_1777364400840.mp4\n-rw-r--r-- 1 lukas staff 266694 28 Apr 11:25 compact_monitor_2_1777364709144.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 11:30 compact_monitor_2_1777365022090.mp4\n-rw-r--r-- 1 lukas staff 264669 28 Apr 11:35 compact_monitor_2_1777365335928.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 11:40 compact_monitor_2_1777365649137.mp4\n-rw-r--r-- 1 lukas staff 266964 28 Apr 11:46 compact_monitor_2_1777365962619.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 11:51 compact_monitor_2_1777366273740.mp4\n-rw-r--r-- 1 lukas staff 265209 28 Apr 11:56 compact_monitor_2_1777366582034.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 12:01 compact_monitor_2_1777366886631.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 12:06 compact_monitor_2_1777367202805.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 12:11 compact_monitor_2_1777367518861.mp4\n-rw-r--r-- 1 lukas staff 269261 28 Apr 12:17 compact_monitor_2_1777367837441.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 12:22 compact_monitor_2_1777368160952.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 12:28 compact_monitor_2_1777368477571.mp4\n-rw-r--r-- 1 lukas staff 267234 28 Apr 12:33 compact_monitor_2_1777368792600.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 12:38 compact_monitor_2_1777369107069.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 12:43 compact_monitor_2_1777369421530.mp4\n-rw-r--r-- 1 lukas staff 266829 28 Apr 12:48 compact_monitor_2_1777369731189.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 12:54 compact_monitor_2_1777370048214.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 12:59 compact_monitor_2_1777370363567.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 13:04 compact_monitor_2_1777370679314.mp4\n-rw-r--r-- 1 lukas staff 268855 28 Apr 13:09 compact_monitor_2_1777370994284.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 13:15 compact_monitor_2_1777371309064.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 13:20 compact_monitor_2_1777371623643.mp4\n-rw-r--r-- 1 lukas staff 266559 28 Apr 13:25 compact_monitor_2_1777371938006.mp4\n-rw-r--r-- 1 lukas staff 265479 28 Apr 13:30 compact_monitor_2_1777372252120.mp4\n-rw-r--r-- 1 lukas staff 266964 28 Apr 13:36 compact_monitor_2_1777372566394.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 13:41 compact_monitor_2_1777372880197.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 13:46 compact_monitor_2_1777373193667.mp4\n-rw-r--r-- 1 lukas staff 265209 28 Apr 13:51 compact_monitor_2_1777373506832.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 13:56 compact_monitor_2_1777373816197.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 14:02 compact_monitor_2_1777374130774.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 14:07 compact_monitor_2_1777374443527.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 14:12 compact_monitor_2_1777374756405.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 14:17 compact_monitor_2_1777375070551.mp4\n-rw-r--r-- 1 lukas staff 264939 28 Apr 14:23 compact_monitor_2_1777375397987.mp4\n-rw-r--r-- 1 lukas staff 267504 28 Apr 14:28 compact_monitor_2_1777375715930.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 14:33 compact_monitor_2_1777376034152.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 14:39 compact_monitor_2_1777376348246.mp4\n-rw-r--r-- 1 lukas staff 266019 28 Apr 14:44 compact_monitor_2_1777376657026.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 14:49 compact_monitor_2_1777376966683.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 14:54 compact_monitor_2_1777377280571.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:00 compact_monitor_2_1777377602616.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:05 compact_monitor_2_1777377915467.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 15:10 compact_monitor_2_1777378232424.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 15:15 compact_monitor_2_1777378547117.mp4\n-rw-r--r-- 1 lukas staff 266154 28 Apr 15:21 compact_monitor_2_1777378865359.mp4\n-rw-r--r-- 1 lukas staff 264804 28 Apr 15:26 compact_monitor_2_1777379183376.mp4\n-rw-r--r-- 1 lukas staff 267774 28 Apr 15:31 compact_monitor_2_1777379502714.mp4\n-rw-r--r-- 1 lukas staff 268046 28 Apr 15:37 compact_monitor_2_1777379819259.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 15:42 compact_monitor_2_1777380134674.mp4\n-rw-r--r-- 1 lukas staff 265749 28 Apr 15:47 compact_monitor_2_1777380454708.mp4\n-rw-r--r-- 1 lukas staff 265344 28 Apr 15:52 compact_monitor_2_1777380771150.mp4\n-rw-r--r-- 1 lukas staff 265884 28 Apr 15:58 compact_monitor_2_1777381086934.mp4\n-rw-r--r-- 1 lukas staff 268044 28 Apr 16:03 compact_monitor_2_1777381401816.mp4\n-rw-r--r-- 1 lukas staff 269530 28 Apr 16:08 compact_monitor_2_1777381720100.mp4\n-rw-r--r-- 1 lukas staff 268721 28 Apr 16:13 compact_monitor_2_1777382037168.mp4\n-rw-r--r-- 1 lukas staff 268583 28 Apr 16:19 compact_monitor_2_1777382355014.mp4\n-rw-r--r-- 1 lukas staff 266424 28 Apr 16:24 compact_monitor_2_1777382670965.mp4\n-rw-r--r-- 1 lukas staff 266289 28 Apr 16:29 compact_monitor_2_1777382984987.mp4\n-rw-r--r-- 1 lukas staff 265074 28 Apr 16:34 compact_monitor_2_1777383298084.mp4\n-rw-r--r-- 1 lukas staff 236209 28 Apr 16:40 compact_monitor_2_1777383610070.mp4\n-rw-r--r-- 1 lukas staff 1191690 28 Apr 17:01 compact_monitor_2_1777384877981.mp4\n-rw-r--r-- 1 lukas staff 2975861 28 Apr 17:06 compact_monitor_2_1777385201736.mp4\n-rw-r--r-- 1 lukas staff 5319560 28 Apr 17:12 compact_monitor_2_1777385529432.mp4\n-rw-r--r-- 1 lukas staff 3006284 28 Apr 17:18 compact_monitor_2_1777385870812.mp4\n-rw-r--r-- 1 lukas staff 2726877 28 Apr 17:23 compact_monitor_2_1777386204715.mp4\n-rw-r--r-- 1 lukas staff 3315722 28 Apr 17:29 compact_monitor_2_1777386541280.mp4\n-rw-r--r-- 1 lukas staff 1577465 28 Apr 17:34 compact_monitor_2_1777386883461.mp4\n-rw-r--r-- 1 lukas staff 1745214 28 Apr 17:40 compact_monitor_2_1777387214543.mp4\n-rw-r--r-- 1 lukas staff 950993 28 Apr 17:45 compact_monitor_2_1777387552842.mp4\n-rw-r--r-- 1 lukas staff 429007 28 Apr 17:51 compact_monitor_2_1777387889075.mp4\n-rw-r--r-- 1 lukas staff 884099 28 Apr 17:57 compact_monitor_2_1777388218623.mp4\n-rw-r--r-- 1 lukas staff 2352504 28 Apr 18:02 compact_monitor_2_1777388548021.mp4\n-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4\n-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4\n-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4\n-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4\n-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4\n-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4\n-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4\n-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4\n-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4\n-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4\n-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4\n-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4\n-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4\n-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4\n-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22523176\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 28 Apr 16:51 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite\n-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27 \n[2026-05-06 18:58:18] ========================================\n[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 18:58:18] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m04s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m06s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m07s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)\n frames (7543 rows) ⠴ % \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27\n[2026-05-06 19:22:16] ========================================\n[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 19:22:16] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m01s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m03s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ✓ 4m40s\n ocr_text (2193 rows) ✓ 0m25s\n ui_events (9909 rows) ✓ 0m02s\n elements (470235 rows) ✓ 2m46s\n meetings (3 rows) ✓ 0m00s\n\n[+08m07s] ▶ Updating FTS indexes\n elements_fts ✓ 2m59s\n frames_fts ✓ 6m07s\n ui_events_fts ✓ 0m03s\n\n[+17m16s] ▶ Verifying DB\n frames: 7543 / 7543 ✓\n elements: 470235 / 470235 ✓\n ui_events: 9909 / 9909 ✓\n ocr_text: 2193 / 2193 ✓\n meetings: 3 / 3 ✓\n\n[+18m46s] ▶ Copying data folder for 2026-04-27\n rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)\n\n[2026-05-06 19:41:28] Archive DB size: 9.7G\n[2026-05-06 19:41:28] Total time: 19m12s\n[2026-05-06 19:41:28] Sync complete for 2026-04-27\n[2026-05-06 19:41:28] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28\n[2026-05-06 19:44:49] ========================================\n[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28\n[2026-05-06 19:44:49] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (9.7G)\n Data dir: OK (223 files, 159M)\n\n[+00m00s] ▶ Counting source rows for 2026-04-28\n frames: 4535\n elements: 407532\n ui_events: 8621\n ocr_text: 1623\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m00s\n creating FTS tables ✓ 0m00s\n\n[+00m02s] ▶ Syncing data for 2026-04-28\n video_chunks ✓ 0m12s\n frames (4535 rows) ✓ 1m30s\n ocr_text (1623 rows) ✓ 0m32s\n ui_events (8621 rows) ✓ 0m01s\n elements (407532 rows) ✓ 1m02s\n meetings (3 rows) ✓ 0m00s\n\n[+03m19s] ▶ Updating FTS indexes\n elements_fts ✓ 1m36s\n frames_fts ✓ 2m28s\n ui_events_fts ✓ 0m04s\n\n[+07m27s] ▶ Verifying DB\n frames: 4535 / 4535 ✓\n elements: 407532 / 407532 ✓\n ui_events: 8621 / 8621 ✓\n ocr_text: 1623 / 1623 ✓\n meetings: 3 / 3 ✓\n\n[+08m59s] ▶ Copying data folder for 2026-04-28\n rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)\n\n[2026-05-06 19:54:08] Archive DB size: 10G\n[2026-05-06 19:54:08] Total time: 9m19s\n[2026-05-06 19:54:08] Sync complete for 2026-04-28\n[2026-05-06 19:54:08] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll\ntotal 24\ndrwx------ 9 lukas staff 288 28 Apr 09:18 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\ndrwx------ 5 lukas staff 160 1 Nov 2021 _cacache\ndrwx------@ 2 lukas staff 64 28 Apr 09:18 _locks\ndrwx------ 15 lukas staff 480 27 Apr 19:54 _logs\ndrwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx\n-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked\n-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json\n-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll \ntotal 52920\ndrwx------+ 92 lukas staff 2944 6 May 20:22 .\ndrwxr-xr-x 5 root admin 160 23 Aug 2024 ..\n-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding\n-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store\ndrwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash\ndrwx------ 5 lukas staff 160 1 Nov 2021 .aws\n-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json\n-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history\n-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc\ndrwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito\ndrwx------@ 6 lukas staff 192 9 Apr 19:53 .cache\ndrwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude\n-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json\ndrwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium\ndrwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer\ndrwx------ 16 lukas staff 512 21 May 2025 .config\ndrwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue\ndrwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot\ndrwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor\ndrwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor\ndrwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona\ndrwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb\ndrwx------ 24 lukas staff 768 27 Apr 18:14 .docker\ndrwx------ 15 lukas staff 480 6 Jun 2023 .dropbox\ndrwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak\n-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth\n-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig\n-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp\ndrwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon\ndrwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc\n-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst\ndrwx------ 5 lukas staff 160 23 Dec 2024 .local\n-rw------- 1 lukas staff 204 16 Mar 2024 .netrc\ndrwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp\n-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history\n-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer\ndrwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py\ndrwx------ 8 lukas staff 256 6 May 20:24 .npm\n-rw------- 1 lukas staff 74 20 May 2024 .npmrc\ndrwx------ 32 lukas staff 1024 25 Jul 2025 .nvm\ndrwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile\n-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history\ndrwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode\ndrwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight\ndrwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint\ndrwx------ 15 lukas staff 480 8 Aug 2025 .ssh\ndrwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit\ndrwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm\n-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\n UW PICO 5.09 New Buffer \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n [ Read 1 line ] \n^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos \n^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell \ndrwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm\ndrwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf\ndrwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn\n-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc\n-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile\n-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy\n-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave\n-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save\n-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees\n-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc\ndrwx------@ 9 lukas staff 288 20 Apr 20:55 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV\ndrwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads\ndrwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen\ndrwx------@ 112 lukas staff 3584 2 Dec 09:19 Library\ndrwx------ 7 lukas staff 224 12 Feb 2024 Movies\ndrwx------+ 5 lukas staff 160 25 Sep 2023 Music\ndrwx------+ 9 lukas staff 288 25 Sep 2023 Pictures\ndrwx------ 3 lukas staff 96 8 Nov 2021 Postman\ndrwx------+ 4 lukas staff 128 28 Oct 2021 Public\n-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf\ndrwx------ 4 lukas staff 128 2 Jul 2023 Users\n-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log\n-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 2025 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast\n-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin\n-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh\n-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe\ncd: no such file or directory: /Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated\nchecking permissions...\n screen recording: ok\n microphone: ok\n accessibility: ok\n2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap\n2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update\n2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits\n2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown\n2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export\n2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary\n2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ false │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n│ retention mode │ media-only (keep transcripts) │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ MacBook Pro Microphone (input) │\n│ │ System Audio (output) │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-05-06T20:27:34.638384Z INFO screenpipe: starting UI event capture\n2026-05-06T20:27:34.637679Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-05-06T20:27:34.649154Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(94))\n2026-05-06T20:27:34.652794Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-05-06T20:27:34.655839Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-05-06T20:27:34.673877Z INFO screenpipe_engine::ui_recorder: UI recording session started: 54869993-7b4b-491f-b717-2a583517f9c5\n2026-05-06T20:27:34.673910Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-05-06T20:27:34.674057Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-05-05 17:27:34.674056 UTC to 2026-05-06 17:27:34.674056 UTC)\n2026-05-06T20:27:34.674892Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-05-06T20:27:34.675788Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 0 frame entries, coverage from 2026-05-05 17:27:34.674056 UTC\n2026-05-06T20:27:34.686546Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-05-06T20:27:34.691371Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-05-06T20:27:36.270608Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-05-06T20:27:36.270669Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.270714Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.932583Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-05-06T20:27:36.932852Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-05-06T20:27:36.932882Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-05-06T20:27:36.932899Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-05-06T20:27:36.932901Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-05-06T20:27:39.158281Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 3 excluded)\n2026-05-06T20:27:39.593177Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1, dur=101ms\n2026-05-06T20:27:40.672366Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)\n2026-05-06T20:27:41.257664Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=2, dur=140ms\n2026-05-06T20:27:44.641022Z INFO screenpipe_audio::transcription::engine: whisper model available: \"/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin\"\n2026-05-06T20:27:44.641079Z INFO screenpipe_audio::transcription::whisper::model: whisper context: gpu acceleration enabled (Metal on macOS, Vulkan on Windows)\n2026-05-06T20:27:44.641086Z INFO screenpipe_audio::transcription::engine: loading whisper model with GPU acceleration...\nwhisper_init_from_file_with_params_no_state: loading model from '/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin'\nwhisper_init_with_params_no_state: use gpu = 1\nwhisper_init_with_params_no_state: flash attn = 0\nwhisper_init_with_params_no_state: gpu_device = 0\nwhisper_init_with_params_no_state: dtw = 0\nggml_metal_device_init: tensor API disabled for pre-M5 and pre-A19 devices\nggml_metal_library_init: using embedded metal library\nggml_metal_library_init: loaded in 0.041 sec\nggml_metal_rsets_init: creating a residency set collection (keep_alive = 180 s)\nggml_metal_device_init: GPU name: Apple M1\nggml_metal_device_init: GPU family: MTLGPUFamilyApple7 (1007)\nggml_metal_device_init: GPU family: MTLGPUFamilyCommon3 (3003)\nggml_metal_device_init: GPU family: MTLGPUFamilyMetal3 (5001)\nggml_metal_device_init: simdgroup reduction = true\nggml_metal_device_init: simdgroup matrix mul. = true\nggml_metal_device_init: has unified memory = true\nggml_metal_device_init: has bfloat = true\nggml_metal_device_init: has tensor = false\nggml_metal_device_init: use residency sets = true\nggml_metal_device_init: use shared buffers = true\nggml_metal_device_init: recommendedMaxWorkingSetSize = 11453.25 MB\nwhisper_init_with_params_no_state: devices = 3\nwhisper_init_with_params_no_state: backends = 3\nwhisper_model_load: loading model\nwhisper_model_load: n_vocab = 51865\nwhisper_model_load: n_audio_ctx = 1500\nwhisper_model_load: n_audio_state = 384\nwhisper_model_load: n_audio_head = 6\nwhisper_model_load: n_audio_layer = 4\nwhisper_model_load: n_text_ctx = 448\nwhisper_model_load: n_text_state = 384\nwhisper_model_load: n_text_head = 6\nwhisper_model_load: n_text_layer = 4\nwhisper_model_load: n_mels = 80\nwhisper_model_load: ftype = 1\nwhisper_model_load: qntvr = 0\nwhisper_model_load: type = 1 (tiny)\nwhisper_model_load: adding 1608 extra tokens\nwhisper_model_load: n_langs = 99\nwhisper_model_load: Metal total size = 77.11 MB\nwhisper_model_load: model size = 77.11 MB\n2026-05-06T20:27:44.857210Z INFO screenpipe_audio::transcription::engine: whisper model loaded successfully\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\n2026-05-06T20:27:44.861912Z INFO screenpipe_audio::audio_manager::manager: transcription session created (will be reused across segments)\n2026-05-06T20:27:44.862480Z INFO screenpipe_audio::audio_manager::manager: audio manager started\n2026-05-06T20:27:44.862525Z INFO screenpipe_audio::audio_manager::manager: calendar-assisted speaker diarization: listening for meeting events\n2026-05-06T20:27:47.831980Z INFO screenpipe_audio::device::device_manager: starting recording for device: System Audio (output)\n2026-05-06T20:27:47.832191Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for System Audio (output) (unknown / 30s segments)\n2026-05-06T20:27:47.906029Z INFO screenpipe_audio::device::device_manager: starting recording for device: MacBook Pro Microphone (input)\n2026-05-06T20:27:47.906090Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for MacBook Pro Microphone (input) (wired / 30s segments)","is_focused":true},{"role":"AXTextField","text":"you","depth":3,"bounds":{"left":0.64793885,"top":1.0,"width":0.0625,"height":-0.07581806},"on_screen":true,"automation_id":"_NS:65","value":"you","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.64860374,"top":1.0,"width":0.00831117,"height":-0.07581806},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.7017952,"top":1.0,"width":0.00731383,"height":-0.07581806},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.7130984,"top":1.0,"width":0.006981383,"height":-0.07661617},"on_screen":true,"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.7200798,"top":1.0,"width":0.006981383,"height":-0.07661617},"on_screen":true,"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.3487367,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.35073137,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.42719415,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42918882,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.58410907,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.58610374,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.6625665,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.66456115,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.4956782,"top":1.0,"width":0.027925532,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
-8608554010568040663
|
5579017683957906497
|
idle
|
accessibility
|
NULL
|
-rw-r--r-- 1 lukas staff 1702453 28 Apr 17:23 -rw-r--r-- 1 lukas staff 1702453 28 Apr 17:23 compact_monitor_1_1777386198870.mp4
-rw-r--r-- 1 lukas staff 2034287 28 Apr 17:29 compact_monitor_1_1777386532344.mp4
-rw-r--r-- 1 lukas staff 1352893 28 Apr 17:34 compact_monitor_1_1777386875277.mp4
-rw-r--r-- 1 lukas staff 1873946 28 Apr 17:40 compact_monitor_1_1777387208685.mp4
-rw-r--r-- 1 lukas staff 1155463 28 Apr 17:45 compact_monitor_1_1777387548798.mp4
-rw-r--r-- 1 lukas staff 1428159 28 Apr 17:51 compact_monitor_1_1777387882691.mp4
-rw-r--r-- 1 lukas staff 1398484 28 Apr 17:56 compact_monitor_1_1777388213861.mp4
-rw-r--r-- 1 lukas staff 1688438 28 Apr 18:02 compact_monitor_1_1777388542869.mp4
-rw-r--r-- 1 lukas staff 2401161 28 Apr 18:07 compact_monitor_1_1777388869470.mp4
-rw-r--r-- 1 lukas staff 1283247 28 Apr 18:13 compact_monitor_1_1777389192202.mp4
-rw-r--r-- 1 lukas staff 1398160 28 Apr 18:18 compact_monitor_1_1777389525394.mp4
-rw-r--r-- 1 lukas staff 452906 28 Apr 18:24 compact_monitor_1_1777389856559.mp4
-rw-r--r-- 1 lukas staff 566518 28 Apr 18:29 compact_monitor_1_1777390191054.mp4
-rw-r--r-- 1 lukas staff 445894 28 Apr 18:35 compact_monitor_1_1777390513567.mp4
-rw-r--r-- 1 lukas staff 444044 28 Apr 18:40 compact_monitor_1_1777390841877.mp4
-rw-r--r-- 1 lukas staff 437853 28 Apr 18:46 compact_monitor_1_1777391162552.mp4
-rw-r--r-- 1 lukas staff 441008 28 Apr 18:51 compact_monitor_1_1777391489107.mp4
-rw-r--r-- 1 lukas staff 443934 28 Apr 18:57 compact_monitor_1_1777391823165.mp4
-rw-r--r-- 1 lukas staff 443624 28 Apr 19:02 compact_monitor_1_1777392146221.mp4
-rw-r--r-- 1 lukas staff 447164 28 Apr 19:07 compact_monitor_1_1777392469679.mp4
-rw-r--r-- 1 lukas staff 442431 28 Apr 19:13 compact_monitor_1_1777392792794.mp4
-rw-r--r-- 1 lukas staff 436805 28 Apr 19:18 compact_monitor_1_1777393109301.mp4
-rw-r--r-- 1 lukas staff 435633 28 Apr 19:23 compact_monitor_1_1777393423192.mp4
-rw-r--r-- 1 lukas staff 1162510 28 Apr 09:30 compact_monitor_2_1777357806702.mp4
-rw-r--r-- 1 lukas staff 3394878 28 Apr 09:35 compact_monitor_2_1777358126186.mp4
-rw-r--r-- 1 lukas staff 268044 28 Apr 09:40 compact_monitor_2_1777358443280.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 09:46 compact_monitor_2_1777358769231.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 09:51 compact_monitor_2_1777359084493.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 09:56 compact_monitor_2_1777359399758.mp4
-rw-r--r-- 1 lukas staff 266694 28 Apr 10:01 compact_monitor_2_1777359707884.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 10:06 compact_monitor_2_1777360016892.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 10:12 compact_monitor_2_1777360329199.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 10:17 compact_monitor_2_1777360641498.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 10:22 compact_monitor_2_1777360953971.mp4
-rw-r--r-- 1 lukas staff 267099 28 Apr 10:27 compact_monitor_2_1777361264266.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 10:33 compact_monitor_2_1777361583211.mp4
-rw-r--r-- 1 lukas staff 266829 28 Apr 10:38 compact_monitor_2_1777361903545.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 10:43 compact_monitor_2_1777362219032.mp4
-rw-r--r-- 1 lukas staff 265614 28 Apr 10:48 compact_monitor_2_1777362532674.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 10:54 compact_monitor_2_1777362845950.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 10:59 compact_monitor_2_1777363157577.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 11:04 compact_monitor_2_1777363473776.mp4
-rw-r--r-- 1 lukas staff 267099 28 Apr 11:09 compact_monitor_2_1777363782342.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 11:14 compact_monitor_2_1777364092822.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 11:20 compact_monitor_2_1777364400840.mp4
-rw-r--r-- 1 lukas staff 266694 28 Apr 11:25 compact_monitor_2_1777364709144.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 11:30 compact_monitor_2_1777365022090.mp4
-rw-r--r-- 1 lukas staff 264669 28 Apr 11:35 compact_monitor_2_1777365335928.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 11:40 compact_monitor_2_1777365649137.mp4
-rw-r--r-- 1 lukas staff 266964 28 Apr 11:46 compact_monitor_2_1777365962619.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 11:51 compact_monitor_2_1777366273740.mp4
-rw-r--r-- 1 lukas staff 265209 28 Apr 11:56 compact_monitor_2_1777366582034.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 12:01 compact_monitor_2_1777366886631.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 12:06 compact_monitor_2_1777367202805.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 12:11 compact_monitor_2_1777367518861.mp4
-rw-r--r-- 1 lukas staff 269261 28 Apr 12:17 compact_monitor_2_1777367837441.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 12:22 compact_monitor_2_1777368160952.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 12:28 compact_monitor_2_1777368477571.mp4
-rw-r--r-- 1 lukas staff 267234 28 Apr 12:33 compact_monitor_2_1777368792600.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 12:38 compact_monitor_2_1777369107069.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 12:43 compact_monitor_2_1777369421530.mp4
-rw-r--r-- 1 lukas staff 266829 28 Apr 12:48 compact_monitor_2_1777369731189.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 12:54 compact_monitor_2_1777370048214.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 12:59 compact_monitor_2_1777370363567.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 13:04 compact_monitor_2_1777370679314.mp4
-rw-r--r-- 1 lukas staff 268855 28 Apr 13:09 compact_monitor_2_1777370994284.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 13:15 compact_monitor_2_1777371309064.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 13:20 compact_monitor_2_1777371623643.mp4
-rw-r--r-- 1 lukas staff 266559 28 Apr 13:25 compact_monitor_2_1777371938006.mp4
-rw-r--r-- 1 lukas staff 265479 28 Apr 13:30 compact_monitor_2_1777372252120.mp4
-rw-r--r-- 1 lukas staff 266964 28 Apr 13:36 compact_monitor_2_1777372566394.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 13:41 compact_monitor_2_1777372880197.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 13:46 compact_monitor_2_1777373193667.mp4
-rw-r--r-- 1 lukas staff 265209 28 Apr 13:51 compact_monitor_2_1777373506832.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 13:56 compact_monitor_2_1777373816197.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 14:02 compact_monitor_2_1777374130774.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 14:07 compact_monitor_2_1777374443527.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 14:12 compact_monitor_2_1777374756405.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 14:17 compact_monitor_2_1777375070551.mp4
-rw-r--r-- 1 lukas staff 264939 28 Apr 14:23 compact_monitor_2_1777375397987.mp4
-rw-r--r-- 1 lukas staff 267504 28 Apr 14:28 compact_monitor_2_1777375715930.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 14:33 compact_monitor_2_1777376034152.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 14:39 compact_monitor_2_1777376348246.mp4
-rw-r--r-- 1 lukas staff 266019 28 Apr 14:44 compact_monitor_2_1777376657026.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 14:49 compact_monitor_2_1777376966683.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 14:54 compact_monitor_2_1777377280571.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:00 compact_monitor_2_1777377602616.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:05 compact_monitor_2_1777377915467.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 15:10 compact_monitor_2_1777378232424.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 15:15 compact_monitor_2_1777378547117.mp4
-rw-r--r-- 1 lukas staff 266154 28 Apr 15:21 compact_monitor_2_1777378865359.mp4
-rw-r--r-- 1 lukas staff 264804 28 Apr 15:26 compact_monitor_2_1777379183376.mp4
-rw-r--r-- 1 lukas staff 267774 28 Apr 15:31 compact_monitor_2_1777379502714.mp4
-rw-r--r-- 1 lukas staff 268046 28 Apr 15:37 compact_monitor_2_1777379819259.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 15:42 compact_monitor_2_1777380134674.mp4
-rw-r--r-- 1 lukas staff 265749 28 Apr 15:47 compact_monitor_2_1777380454708.mp4
-rw-r--r-- 1 lukas staff 265344 28 Apr 15:52 compact_monitor_2_1777380771150.mp4
-rw-r--r-- 1 lukas staff 265884 28 Apr 15:58 compact_monitor_2_1777381086934.mp4
-rw-r--r-- 1 lukas staff 268044 28 Apr 16:03 compact_monitor_2_1777381401816.mp4
-rw-r--r-- 1 lukas staff 269530 28 Apr 16:08 compact_monitor_2_1777381720100.mp4
-rw-r--r-- 1 lukas staff 268721 28 Apr 16:13 compact_monitor_2_1777382037168.mp4
-rw-r--r-- 1 lukas staff 268583 28 Apr 16:19 compact_monitor_2_1777382355014.mp4
-rw-r--r-- 1 lukas staff 266424 28 Apr 16:24 compact_monitor_2_1777382670965.mp4
-rw-r--r-- 1 lukas staff 266289 28 Apr 16:29 compact_monitor_2_1777382984987.mp4
-rw-r--r-- 1 lukas staff 265074 28 Apr 16:34 compact_monitor_2_1777383298084.mp4
-rw-r--r-- 1 lukas staff 236209 28 Apr 16:40 compact_monitor_2_1777383610070.mp4
-rw-r--r-- 1 lukas staff 1191690 28 Apr 17:01 compact_monitor_2_1777384877981.mp4
-rw-r--r-- 1 lukas staff 2975861 28 Apr 17:06 compact_monitor_2_1777385201736.mp4
-rw-r--r-- 1 lukas staff 5319560 28 Apr 17:12 compact_monitor_2_1777385529432.mp4
-rw-r--r-- 1 lukas staff 3006284 28 Apr 17:18 compact_monitor_2_1777385870812.mp4
-rw-r--r-- 1 lukas staff 2726877 28 Apr 17:23 compact_monitor_2_1777386204715.mp4
-rw-r--r-- 1 lukas staff 3315722 28 Apr 17:29 compact_monitor_2_1777386541280.mp4
-rw-r--r-- 1 lukas staff 1577465 28 Apr 17:34 compact_monitor_2_1777386883461.mp4
-rw-r--r-- 1 lukas staff 1745214 28 Apr 17:40 compact_monitor_2_1777387214543.mp4
-rw-r--r-- 1 lukas staff 950993 28 Apr 17:45 compact_monitor_2_1777387552842.mp4
-rw-r--r-- 1 lukas staff 429007 28 Apr 17:51 compact_monitor_2_1777387889075.mp4
-rw-r--r-- 1 lukas staff 884099 28 Apr 17:57 compact_monitor_2_1777388218623.mp4
-rw-r--r-- 1 lukas staff 2352504 28 Apr 18:02 compact_monitor_2_1777388548021.mp4
-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4
-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4
-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4
-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4
-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4
-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4
-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4
-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4
-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4
-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4
-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4
-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4
-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4
-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4
-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22523176
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 28 Apr 16:51 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite
-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm
-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 18:58:18] ========================================
[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27
[2026-05-06 18:58:18] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m04s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m06s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m07s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)
frames (7543 rows) ⠴ %
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 19:22:16] ========================================
[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27
[2026-05-06 19:22:16] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m01s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m03s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ✓ 4m40s
ocr_text (2193 rows) ✓ 0m25s
ui_events (9909 rows) ✓ 0m02s
elements (470235 rows) ✓ 2m46s
meetings (3 rows) ✓ 0m00s
[+08m07s] ▶ Updating FTS indexes
elements_fts ✓ 2m59s
frames_fts ✓ 6m07s
ui_events_fts ✓ 0m03s
[+17m16s] ▶ Verifying DB
frames: 7543 / 7543 ✓
elements: 470235 / 470235 ✓
ui_events: 9909 / 9909 ✓
ocr_text: 2193 / 2193 ✓
meetings: 3 / 3 ✓
[+18m46s] ▶ Copying data folder for 2026-04-27
rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)
[2026-05-06 19:41:28] Archive DB size: 9.7G
[2026-05-06 19:41:28] Total time: 19m12s
[2026-05-06 19:41:28] Sync complete for 2026-04-27
[2026-05-06 19:41:28] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28
[2026-05-06 19:44:49] ========================================
[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28
[2026-05-06 19:44:49] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (9.7G)
Data dir: OK (223 files, 159M)
[+00m00s] ▶ Counting source rows for 2026-04-28
frames: 4535
elements: 407532
ui_events: 8621
ocr_text: 1623
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m00s
creating FTS tables ✓ 0m00s
[+00m02s] ▶ Syncing data for 2026-04-28
video_chunks ✓ 0m12s
frames (4535 rows) ✓ 1m30s
ocr_text (1623 rows) ✓ 0m32s
ui_events (8621 rows) ✓ 0m01s
elements (407532 rows) ✓ 1m02s
meetings (3 rows) ✓ 0m00s
[+03m19s] ▶ Updating FTS indexes
elements_fts ✓ 1m36s
frames_fts ✓ 2m28s
ui_events_fts ✓ 0m04s
[+07m27s] ▶ Verifying DB
frames: 4535 / 4535 ✓
elements: 407532 / 407532 ✓
ui_events: 8621 / 8621 ✓
ocr_text: 1623 / 1623 ✓
meetings: 3 / 3 ✓
[+08m59s] ▶ Copying data folder for 2026-04-28
rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)
[2026-05-06 19:54:08] Archive DB size: 10G
[2026-05-06 19:54:08] Total time: 9m19s
[2026-05-06 19:54:08] Sync complete for 2026-04-28
[2026-05-06 19:54:08] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll
total 24
drwx------ 9 lukas staff 288 28 Apr 09:18 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
drwx------ 5 lukas staff 160 1 Nov 2021 _cacache
drwx------@ 2 lukas staff 64 28 Apr 09:18 _locks
drwx------ 15 lukas staff 480 27 Apr 19:54 _logs
drwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx
-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked
-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json
-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 52920
drwx------+ 92 lukas staff 2944 6 May 20:22 .
drwxr-xr-x 5 root admin 160 23 Aug 2024 ..
-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding
-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store
drwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash
drwx------ 5 lukas staff 160 1 Nov 2021 .aws
-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json
-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history
-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc
drwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito
drwx------@ 6 lukas staff 192 9 Apr 19:53 .cache
drwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude
-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json
drwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium
drwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer
drwx------ 16 lukas staff 512 21 May 2025 .config
drwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue
drwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot
drwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor
drwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor
drwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona
drwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb
drwx------ 24 lukas staff 768 27 Apr 18:14 .docker
drwx------ 15 lukas staff 480 6 Jun 2023 .dropbox
drwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak
-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth
-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig
-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp
drwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon
drwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc
-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst
drwx------ 5 lukas staff 160 23 Dec 2024 .local
-rw------- 1 lukas staff 204 16 Mar 2024 .netrc
drwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp
-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history
-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer
drwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py
drwx------ 8 lukas staff 256 6 May 20:24 .npm
-rw------- 1 lukas staff 74 20 May 2024 .npmrc
drwx------ 32 lukas staff 1024 25 Jul 2025 .nvm
drwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile
-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history
drwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode
drwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight
drwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint
drwx------ 15 lukas staff 480 8 Aug 2025 .ssh
drwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit
drwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm
-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
UW PICO 5.09 New Buffer
[ Read 1 line ]
^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos
^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell
drwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm
drwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf
drwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn
-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc
-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile
-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy
-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave
-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save
-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees
-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc
drwx------@ 9 lukas staff 288 20 Apr 20:55 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV
drwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads
drwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen
drwx------@ 112 lukas staff 3584 2 Dec 09:19 Library
drwx------ 7 lukas staff 224 12 Feb 2024 Movies
drwx------+ 5 lukas staff 160 25 Sep 2023 Music
drwx------+ 9 lukas staff 288 25 Sep 2023 Pictures
drwx------ 3 lukas staff 96 8 Nov 2021 Postman
drwx------+ 4 lukas staff 128 28 Oct 2021 Public
-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf
drwx------ 4 lukas staff 128 2 Jul 2023 Users
-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log
-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log
-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4
-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 2025 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast
-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin
-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh
-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
cd: no such file or directory: /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated
checking permissions...
screen recording: ok
microphone: ok
accessibility: ok
2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap
2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update
2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits
2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown
2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export
2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary
2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ false │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 7 │
│ retention mode │ media-only (keep transcripts) │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ MacBook Pro Microphone (input) │
│ │ System Audio (output) │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: https://github.com/screenpipe/screenpipe/releases
2026-05-06T20:27:34.638384Z INFO screenpipe: starting UI event capture
2026-05-06T20:27:34.637679Z INFO screenpipe_core::pipes...
|
2
|
NULL
|
|
51
|
4
|
13
|
2026-05-06T17:31:42.773448+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778088702773_m2.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
-rw-r--r-- 1 lukas staff 950993 28 Apr 17:45 -rw-r--r-- 1 lukas staff 950993 28 Apr 17:45 compact_monitor_2_1777387552842.mp4
-rw-r--r-- 1 lukas staff 429007 28 Apr 17:51 compact_monitor_2_1777387889075.mp4
-rw-r--r-- 1 lukas staff 884099 28 Apr 17:57 compact_monitor_2_1777388218623.mp4
-rw-r--r-- 1 lukas staff 2352504 28 Apr 18:02 compact_monitor_2_1777388548021.mp4
-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4
-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4
-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4
-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4
-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4
-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4
-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4
-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4
-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4
-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4
-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4
-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4
-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4
-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4
-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22523176
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 28 Apr 16:51 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite
-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm
-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 18:58:18] ========================================
[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27
[2026-05-06 18:58:18] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m04s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m06s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m07s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)
frames (7543 rows) ⠴ %
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 19:22:16] ========================================
[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27
[2026-05-06 19:22:16] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m01s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m03s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ✓ 4m40s
ocr_text (2193 rows) ✓ 0m25s
ui_events (9909 rows) ✓ 0m02s
elements (470235 rows) ✓ 2m46s
meetings (3 rows) ✓ 0m00s
[+08m07s] ▶ Updating FTS indexes
elements_fts ✓ 2m59s
frames_fts ✓ 6m07s
ui_events_fts ✓ 0m03s
[+17m16s] ▶ Verifying DB
frames: 7543 / 7543 ✓
elements: 470235 / 470235 ✓
ui_events: 9909 / 9909 ✓
ocr_text: 2193 / 2193 ✓
meetings: 3 / 3 ✓
[+18m46s] ▶ Copying data folder for 2026-04-27
rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)
[2026-05-06 19:41:28] Archive DB size: 9.7G
[2026-05-06 19:41:28] Total time: 19m12s
[2026-05-06 19:41:28] Sync complete for 2026-04-27
[2026-05-06 19:41:28] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28
[2026-05-06 19:44:49] ========================================
[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28
[2026-05-06 19:44:49] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (9.7G)
Data dir: OK (223 files, 159M)
[+00m00s] ▶ Counting source rows for 2026-04-28
frames: 4535
elements: 407532
ui_events: 8621
ocr_text: 1623
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m00s
creating FTS tables ✓ 0m00s
[+00m02s] ▶ Syncing data for 2026-04-28
video_chunks ✓ 0m12s
frames (4535 rows) ✓ 1m30s
ocr_text (1623 rows) ✓ 0m32s
ui_events (8621 rows) ✓ 0m01s
elements (407532 rows) ✓ 1m02s
meetings (3 rows) ✓ 0m00s
[+03m19s] ▶ Updating FTS indexes
elements_fts ✓ 1m36s
frames_fts ✓ 2m28s
ui_events_fts ✓ 0m04s
[+07m27s] ▶ Verifying DB
frames: 4535 / 4535 ✓
elements: 407532 / 407532 ✓
ui_events: 8621 / 8621 ✓
ocr_text: 1623 / 1623 ✓
meetings: 3 / 3 ✓
[+08m59s] ▶ Copying data folder for 2026-04-28
rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)
[2026-05-06 19:54:08] Archive DB size: 10G
[2026-05-06 19:54:08] Total time: 9m19s
[2026-05-06 19:54:08] Sync complete for 2026-04-28
[2026-05-06 19:54:08] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll
total 24
drwx------ 9 lukas staff 288 28 Apr 09:18 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
drwx------ 5 lukas staff 160 1 Nov 2021 _cacache
drwx------@ 2 lukas staff 64 28 Apr 09:18 _locks
drwx------ 15 lukas staff 480 27 Apr 19:54 _logs
drwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx
-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked
-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json
-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 52920
drwx------+ 92 lukas staff 2944 6 May 20:22 .
drwxr-xr-x 5 root admin 160 23 Aug 2024 ..
-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding
-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store
drwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash
drwx------ 5 lukas staff 160 1 Nov 2021 .aws
-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json
-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history
-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc
drwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito
drwx------@ 6 lukas staff 192 9 Apr 19:53 .cache
drwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude
-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json
drwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium
drwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer
drwx------ 16 lukas staff 512 21 May 2025 .config
drwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue
drwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot
drwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor
drwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor
drwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona
drwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb
drwx------ 24 lukas staff 768 27 Apr 18:14 .docker
drwx------ 15 lukas staff 480 6 Jun 2023 .dropbox
drwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak
-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth
-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig
-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp
drwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon
drwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc
-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst
drwx------ 5 lukas staff 160 23 Dec 2024 .local
-rw------- 1 lukas staff 204 16 Mar 2024 .netrc
drwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp
-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history
-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer
drwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py
drwx------ 8 lukas staff 256 6 May 20:24 .npm
-rw------- 1 lukas staff 74 20 May 2024 .npmrc
drwx------ 32 lukas staff 1024 25 Jul 2025 .nvm
drwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile
-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history
drwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode
drwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight
drwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint
drwx------ 15 lukas staff 480 8 Aug 2025 .ssh
drwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit
drwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm
-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
UW PICO 5.09 New Buffer
[ Read 1 line ]
^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos
^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell
drwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm
drwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf
drwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn
-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc
-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile
-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy
-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave
-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save
-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees
-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc
drwx------@ 9 lukas staff 288 20 Apr 20:55 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV
drwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads
drwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen
drwx------@ 112 lukas staff 3584 2 Dec 09:19 Library
drwx------ 7 lukas staff 224 12 Feb 2024 Movies
drwx------+ 5 lukas staff 160 25 Sep 2023 Music
drwx------+ 9 lukas staff 288 25 Sep 2023 Pictures
drwx------ 3 lukas staff 96 8 Nov 2021 Postman
drwx------+ 4 lukas staff 128 28 Oct 2021 Public
-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf
drwx------ 4 lukas staff 128 2 Jul 2023 Users
-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log
-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log
-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4
-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 2025 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast
-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin
-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh
-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
cd: no such file or directory: /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated
checking permissions...
screen recording: ok
microphone: ok
accessibility: ok
2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap
2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update
2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits
2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown
2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export
2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary
2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ false │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 7 │
│ retention mode │ media-only (keep transcripts) │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ MacBook Pro Microphone (input) │
│ │ System Audio (output) │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: https://github.com/screenpipe/screenpipe/releases
2026-05-06T20:27:34.638384Z INFO screenpipe: starting UI event capture
2026-05-06T20:27:34.637679Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-05-06T20:27:34.649154Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(94))
2026-05-06T20:27:34.652794Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh
2026-05-06T20:27:34.655839Z INFO screenpipe_engine::ui_recorder: Starting UI event capture
2026-05-06T20:27:34.673877Z INFO screenpipe_engine::ui_recorder: UI recording session started: 54869993-7b4b-491f-b717-2a583517f9c5
2026-05-06T20:27:34.673910Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)
2026-05-06T20:27:34.674057Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-05-05 17:27:34.674056 UTC to 2026-05-06 17:27:34.674056 UTC)
2026-05-06T20:27:34.674892Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)
2026-05-06T20:27:34.675788Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 0 frame entries, coverage from 2026-05-05 17:27:34.674056 UTC
2026-05-06T20:27:34.686546Z INFO screenpipe_engine::server: Server listening on [IP_ADDRESS]:3030
2026-05-06T20:27:34.691371Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030
2026-05-06T20:27:36.270608Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)
2026-05-06T20:27:36.270669Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)
2026-05-06T20:27:36.270714Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)
2026-05-06T20:27:36.932583Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)
2026-05-06T20:27:36.932852Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)
2026-05-06T20:27:36.932882Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)
2026-05-06T20:27:36.932899Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)
2026-05-06T20:27:36.932901Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)
2026-05-06T20:27:39.158281Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 3 excluded)
2026-05-06T20:27:39.593177Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1, dur=101ms
2026-05-06T20:27:40.672366Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)
2026-05-06T20:27:41.257664Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=2, dur=140ms
2026-05-06T20:27:44.641022Z INFO screenpipe_audio::transcription::engine: whisper model available: "/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin"
2026-05-06T20:27:44.641079Z INFO screenpipe_audio::transcription::whisper::model: whisper context: gpu acceleration enabled (Metal on macOS, Vulkan on Windows)
2026-05-06T20:27:44.641086Z INFO screenpipe_audio::transcription::engine: loading whisper model with GPU acceleration...
whisper_init_from_file_with_params_no_state: loading model from '/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin'
whisper_init_with_params_no_state: use gpu = 1
whisper_init_with_params_no_state: flash attn = 0
whisper_init_with_params_no_state: gpu_device = 0
whisper_init_with_params_no_state: dtw = 0
ggml_metal_device_init: tensor API disabled for pre-M5 and pre-A19 devices
ggml_metal_library_init: using embedded metal library
ggml_metal_library_init: loaded in 0.041 sec
ggml_metal_rsets_init: creating a residency set collection (keep_alive = 180 s)
ggml_metal_device_init: GPU name: Apple M1
ggml_metal_device_init: GPU family: MTLGPUFamilyApple7 (1007)
ggml_metal_device_init: GPU family: MTLGPUFamilyCommon3 (3003)
ggml_metal_device_init: GPU family: MTLGPUFamilyMetal3 (5001)
ggml_metal_device_init: simdgroup reduction = true
ggml_metal_device_init: simdgroup matrix mul. = true
ggml_metal_device_init: has unified memory = true
ggml_metal_device_init: has bfloat = true
ggml_metal_device_init: has tensor = false
ggml_metal_device_init: use residency sets = true
ggml_metal_device_init: use shared buffers = true
ggml_metal_device_init: recommendedMaxWorkingSetSize = 11453.25 MB
whisper_init_with_params_no_state: devices = 3
whisper_init_with_params_no_state: backends = 3
whisper_model_load: loading model
whisper_model_load: n_vocab = 51865
whisper_model_load: n_audio_ctx = 1500
whisper_model_load: n_audio_state = 384
whisper_model_load: n_audio_head = 6
whisper_model_load: n_audio_layer = 4
whisper_model_load: n_text_ctx = 448
whisper_model_load: n_text_state = 384
whisper_model_load: n_text_head = 6
whisper_model_load: n_text_layer = 4
whisper_model_load: n_mels = 80
whisper_model_load: ftype = 1
whisper_model_load: qntvr = 0
whisper_model_load: type = 1 (tiny)
whisper_model_load: adding 1608 extra tokens
whisper_model_load: n_langs = 99
whisper_model_load: Metal total size = 77.11 MB
whisper_model_load: model size = 77.11 MB
2026-05-06T20:27:44.857210Z INFO screenpipe_audio::transcription::engine: whisper model loaded successfully
whisper_backend_init_gpu: device 0: Metal (type: 1)
whisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)
whisper_backend_init_gpu: using Metal backend
ggml_metal_init: allocating
ggml_metal_init: found device: Apple M1
ggml_metal_init: picking default device: Apple M1
ggml_metal_init: use fusion = true
ggml_metal_init: use concurrency = true
ggml_metal_init: use graph optimize = true
whisper_backend_init: using BLAS backend
whisper_init_state: kv self size = 3.15 MB
whisper_init_state: kv cross size = 9.44 MB
whisper_init_state: kv pad size = 2.36 MB
whisper_init_state: compute buffer (conv) = 14.17 MB
whisper_init_state: compute buffer (encode) = 65.96 MB
whisper_init_state: compute buffer (cross) = 8.50 MB
whisper_init_state: compute buffer (decode) = 96.83 MB
2026-05-06T20:27:44.861912Z INFO screenpipe_audio::audio_manager::manager: transcription session created (will be reused across segments)
2026-05-06T20:27:44.862480Z INFO screenpipe_audio::audio_manager::manager: audio manager started
2026-05-06T20:27:44.862525Z INFO screenpipe_audio::audio_manager::manager: calendar-assisted speaker diarization: listening for meeting events
2026-05-06T20:27:47.831980Z INFO screenpipe_audio::device::device_manager: starting recording for device: System Audio (output)
2026-05-06T20:27:47.832191Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for System Audio (output) (unknown / 30s segments)
2026-05-06T20:27:47.906029Z INFO screenpipe_audio::device::device_manager: starting recording for device: MacBook Pro Microphone (input)
2026-05-06T20:27:47.906090Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for MacBook Pro Microphone (input) (wired / 30s segments)
2026-05-06T20:28:15.251258Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8608554010568040663, trigger=visual_change)
whisper_backend_init_gpu: device 0: Metal (type: 1)
whisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)
whisper_backend_init_gpu: using Metal backend
ggml_metal_init: allocating
ggml_metal_init: found device: Apple M1
ggml_metal_init: picking default device: Apple M1
ggml_metal_init: use fusion = true
ggml_metal_init: use concurrency = true
ggml_metal_init: use graph optimize = true
whisper_backend_init: using BLAS backend
whisper_init_state: kv self size = 3.15 MB
whisper_init_state: kv cross size = 9.44 MB
whisper_init_state: kv pad size = 2.36 MB
whisper_init_state: compute buffer (conv) = 14.17 MB
whisper_init_state: compute buffer (encode) = 65.96 MB
whisper_init_state: compute buffer (cross) = 8.50 MB
whisper_init_state: compute buffer (decode) = 96.83 MB
ggml_metal_free: deallocating
whisper_backend_init_gpu: device 0: Metal (type: 1)
whisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)
whisper_backend_init_gpu: using Metal backend
ggml_metal_init: allocating
ggml_metal_init: found device: Apple M1
ggml_metal_init: picking default device: Apple M1
ggml_metal_init: use fusion = true
ggml_metal_init: use concurrency = true
ggml_metal_init: use graph optimize = true
whisper_backend_init: using BLAS backend
whisper_init_state: kv self size = 3.15 MB
whisper_init_state: kv cross size = 9.44 MB
whisper_init_state: kv pad size = 2.36 MB
whisper_init_state: compute buffer (conv) = 14.17 MB
whisper_init_state: compute buffer (encode) = 65.96 MB
whisper_init_state: compute buffer (cross) = 8.50 MB
whisper_init_state: compute buffer (decode) = 96.83 MB
ggml_metal_free: deallocating
whisper_backend_init_gpu: device 0: Metal (type: 1)
whisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)
whisper_backend_init_gpu: using Metal backend
ggml_metal_init: allocating
ggml_metal_init: found device: Apple M1
ggml_metal_init: picking default device: Apple M1
ggml_metal_init: use fusion = true
ggml_metal_init: use concurrency = true
ggml_metal_init: use graph optimize = true
whisper_backend_init: using BLAS backend
whisper_init_state...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"-rw-r--r-- 1 lukas staff 950993 28 Apr 17:45 compact_monitor_2_1777387552842.mp4\n-rw-r--r-- 1 lukas staff 429007 28 Apr 17:51 compact_monitor_2_1777387889075.mp4\n-rw-r--r-- 1 lukas staff 884099 28 Apr 17:57 compact_monitor_2_1777388218623.mp4\n-rw-r--r-- 1 lukas staff 2352504 28 Apr 18:02 compact_monitor_2_1777388548021.mp4\n-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4\n-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4\n-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4\n-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4\n-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4\n-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4\n-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4\n-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4\n-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4\n-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4\n-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4\n-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4\n-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4\n-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4\n-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22523176\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 28 Apr 16:51 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite\n-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27 \n[2026-05-06 18:58:18] ========================================\n[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 18:58:18] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m04s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m06s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m07s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)\n frames (7543 rows) ⠴ % \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27\n[2026-05-06 19:22:16] ========================================\n[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 19:22:16] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m01s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m03s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ✓ 4m40s\n ocr_text (2193 rows) ✓ 0m25s\n ui_events (9909 rows) ✓ 0m02s\n elements (470235 rows) ✓ 2m46s\n meetings (3 rows) ✓ 0m00s\n\n[+08m07s] ▶ Updating FTS indexes\n elements_fts ✓ 2m59s\n frames_fts ✓ 6m07s\n ui_events_fts ✓ 0m03s\n\n[+17m16s] ▶ Verifying DB\n frames: 7543 / 7543 ✓\n elements: 470235 / 470235 ✓\n ui_events: 9909 / 9909 ✓\n ocr_text: 2193 / 2193 ✓\n meetings: 3 / 3 ✓\n\n[+18m46s] ▶ Copying data folder for 2026-04-27\n rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)\n\n[2026-05-06 19:41:28] Archive DB size: 9.7G\n[2026-05-06 19:41:28] Total time: 19m12s\n[2026-05-06 19:41:28] Sync complete for 2026-04-27\n[2026-05-06 19:41:28] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28\n[2026-05-06 19:44:49] ========================================\n[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28\n[2026-05-06 19:44:49] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (9.7G)\n Data dir: OK (223 files, 159M)\n\n[+00m00s] ▶ Counting source rows for 2026-04-28\n frames: 4535\n elements: 407532\n ui_events: 8621\n ocr_text: 1623\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m00s\n creating FTS tables ✓ 0m00s\n\n[+00m02s] ▶ Syncing data for 2026-04-28\n video_chunks ✓ 0m12s\n frames (4535 rows) ✓ 1m30s\n ocr_text (1623 rows) ✓ 0m32s\n ui_events (8621 rows) ✓ 0m01s\n elements (407532 rows) ✓ 1m02s\n meetings (3 rows) ✓ 0m00s\n\n[+03m19s] ▶ Updating FTS indexes\n elements_fts ✓ 1m36s\n frames_fts ✓ 2m28s\n ui_events_fts ✓ 0m04s\n\n[+07m27s] ▶ Verifying DB\n frames: 4535 / 4535 ✓\n elements: 407532 / 407532 ✓\n ui_events: 8621 / 8621 ✓\n ocr_text: 1623 / 1623 ✓\n meetings: 3 / 3 ✓\n\n[+08m59s] ▶ Copying data folder for 2026-04-28\n rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)\n\n[2026-05-06 19:54:08] Archive DB size: 10G\n[2026-05-06 19:54:08] Total time: 9m19s\n[2026-05-06 19:54:08] Sync complete for 2026-04-28\n[2026-05-06 19:54:08] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll\ntotal 24\ndrwx------ 9 lukas staff 288 28 Apr 09:18 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\ndrwx------ 5 lukas staff 160 1 Nov 2021 _cacache\ndrwx------@ 2 lukas staff 64 28 Apr 09:18 _locks\ndrwx------ 15 lukas staff 480 27 Apr 19:54 _logs\ndrwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx\n-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked\n-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json\n-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll \ntotal 52920\ndrwx------+ 92 lukas staff 2944 6 May 20:22 .\ndrwxr-xr-x 5 root admin 160 23 Aug 2024 ..\n-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding\n-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store\ndrwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash\ndrwx------ 5 lukas staff 160 1 Nov 2021 .aws\n-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json\n-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history\n-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc\ndrwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito\ndrwx------@ 6 lukas staff 192 9 Apr 19:53 .cache\ndrwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude\n-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json\ndrwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium\ndrwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer\ndrwx------ 16 lukas staff 512 21 May 2025 .config\ndrwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue\ndrwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot\ndrwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor\ndrwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor\ndrwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona\ndrwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb\ndrwx------ 24 lukas staff 768 27 Apr 18:14 .docker\ndrwx------ 15 lukas staff 480 6 Jun 2023 .dropbox\ndrwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak\n-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth\n-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig\n-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp\ndrwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon\ndrwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc\n-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst\ndrwx------ 5 lukas staff 160 23 Dec 2024 .local\n-rw------- 1 lukas staff 204 16 Mar 2024 .netrc\ndrwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp\n-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history\n-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer\ndrwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py\ndrwx------ 8 lukas staff 256 6 May 20:24 .npm\n-rw------- 1 lukas staff 74 20 May 2024 .npmrc\ndrwx------ 32 lukas staff 1024 25 Jul 2025 .nvm\ndrwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile\n-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history\ndrwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode\ndrwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight\ndrwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint\ndrwx------ 15 lukas staff 480 8 Aug 2025 .ssh\ndrwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit\ndrwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm\n-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\n UW PICO 5.09 New Buffer \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n [ Read 1 line ] \n^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos \n^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell \ndrwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm\ndrwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf\ndrwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn\n-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc\n-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile\n-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy\n-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave\n-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save\n-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees\n-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc\ndrwx------@ 9 lukas staff 288 20 Apr 20:55 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV\ndrwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads\ndrwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen\ndrwx------@ 112 lukas staff 3584 2 Dec 09:19 Library\ndrwx------ 7 lukas staff 224 12 Feb 2024 Movies\ndrwx------+ 5 lukas staff 160 25 Sep 2023 Music\ndrwx------+ 9 lukas staff 288 25 Sep 2023 Pictures\ndrwx------ 3 lukas staff 96 8 Nov 2021 Postman\ndrwx------+ 4 lukas staff 128 28 Oct 2021 Public\n-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf\ndrwx------ 4 lukas staff 128 2 Jul 2023 Users\n-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log\n-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 2025 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast\n-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin\n-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh\n-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe\ncd: no such file or directory: /Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated\nchecking permissions...\n screen recording: ok\n microphone: ok\n accessibility: ok\n2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap\n2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update\n2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits\n2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown\n2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export\n2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary\n2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ false │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n│ retention mode │ media-only (keep transcripts) │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ MacBook Pro Microphone (input) │\n│ │ System Audio (output) │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-05-06T20:27:34.638384Z INFO screenpipe: starting UI event capture\n2026-05-06T20:27:34.637679Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-05-06T20:27:34.649154Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(94))\n2026-05-06T20:27:34.652794Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-05-06T20:27:34.655839Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-05-06T20:27:34.673877Z INFO screenpipe_engine::ui_recorder: UI recording session started: 54869993-7b4b-491f-b717-2a583517f9c5\n2026-05-06T20:27:34.673910Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-05-06T20:27:34.674057Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-05-05 17:27:34.674056 UTC to 2026-05-06 17:27:34.674056 UTC)\n2026-05-06T20:27:34.674892Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-05-06T20:27:34.675788Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 0 frame entries, coverage from 2026-05-05 17:27:34.674056 UTC\n2026-05-06T20:27:34.686546Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-05-06T20:27:34.691371Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-05-06T20:27:36.270608Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-05-06T20:27:36.270669Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.270714Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.932583Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-05-06T20:27:36.932852Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-05-06T20:27:36.932882Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-05-06T20:27:36.932899Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-05-06T20:27:36.932901Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-05-06T20:27:39.158281Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 3 excluded)\n2026-05-06T20:27:39.593177Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1, dur=101ms\n2026-05-06T20:27:40.672366Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)\n2026-05-06T20:27:41.257664Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=2, dur=140ms\n2026-05-06T20:27:44.641022Z INFO screenpipe_audio::transcription::engine: whisper model available: \"/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin\"\n2026-05-06T20:27:44.641079Z INFO screenpipe_audio::transcription::whisper::model: whisper context: gpu acceleration enabled (Metal on macOS, Vulkan on Windows)\n2026-05-06T20:27:44.641086Z INFO screenpipe_audio::transcription::engine: loading whisper model with GPU acceleration...\nwhisper_init_from_file_with_params_no_state: loading model from '/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin'\nwhisper_init_with_params_no_state: use gpu = 1\nwhisper_init_with_params_no_state: flash attn = 0\nwhisper_init_with_params_no_state: gpu_device = 0\nwhisper_init_with_params_no_state: dtw = 0\nggml_metal_device_init: tensor API disabled for pre-M5 and pre-A19 devices\nggml_metal_library_init: using embedded metal library\nggml_metal_library_init: loaded in 0.041 sec\nggml_metal_rsets_init: creating a residency set collection (keep_alive = 180 s)\nggml_metal_device_init: GPU name: Apple M1\nggml_metal_device_init: GPU family: MTLGPUFamilyApple7 (1007)\nggml_metal_device_init: GPU family: MTLGPUFamilyCommon3 (3003)\nggml_metal_device_init: GPU family: MTLGPUFamilyMetal3 (5001)\nggml_metal_device_init: simdgroup reduction = true\nggml_metal_device_init: simdgroup matrix mul. = true\nggml_metal_device_init: has unified memory = true\nggml_metal_device_init: has bfloat = true\nggml_metal_device_init: has tensor = false\nggml_metal_device_init: use residency sets = true\nggml_metal_device_init: use shared buffers = true\nggml_metal_device_init: recommendedMaxWorkingSetSize = 11453.25 MB\nwhisper_init_with_params_no_state: devices = 3\nwhisper_init_with_params_no_state: backends = 3\nwhisper_model_load: loading model\nwhisper_model_load: n_vocab = 51865\nwhisper_model_load: n_audio_ctx = 1500\nwhisper_model_load: n_audio_state = 384\nwhisper_model_load: n_audio_head = 6\nwhisper_model_load: n_audio_layer = 4\nwhisper_model_load: n_text_ctx = 448\nwhisper_model_load: n_text_state = 384\nwhisper_model_load: n_text_head = 6\nwhisper_model_load: n_text_layer = 4\nwhisper_model_load: n_mels = 80\nwhisper_model_load: ftype = 1\nwhisper_model_load: qntvr = 0\nwhisper_model_load: type = 1 (tiny)\nwhisper_model_load: adding 1608 extra tokens\nwhisper_model_load: n_langs = 99\nwhisper_model_load: Metal total size = 77.11 MB\nwhisper_model_load: model size = 77.11 MB\n2026-05-06T20:27:44.857210Z INFO screenpipe_audio::transcription::engine: whisper model loaded successfully\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\n2026-05-06T20:27:44.861912Z INFO screenpipe_audio::audio_manager::manager: transcription session created (will be reused across segments)\n2026-05-06T20:27:44.862480Z INFO screenpipe_audio::audio_manager::manager: audio manager started\n2026-05-06T20:27:44.862525Z INFO screenpipe_audio::audio_manager::manager: calendar-assisted speaker diarization: listening for meeting events\n2026-05-06T20:27:47.831980Z INFO screenpipe_audio::device::device_manager: starting recording for device: System Audio (output)\n2026-05-06T20:27:47.832191Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for System Audio (output) (unknown / 30s segments)\n2026-05-06T20:27:47.906029Z INFO screenpipe_audio::device::device_manager: starting recording for device: MacBook Pro Microphone (input)\n2026-05-06T20:27:47.906090Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for MacBook Pro Microphone (input) (wired / 30s segments)\n2026-05-06T20:28:15.251258Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8608554010568040663, trigger=visual_change)\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\n2026-05-06T20:29:45.187551Z INFO screenpipe_audio::audio_manager::manager: reconciliation: transcribed 6 orphaned chunks\n2026-05-06T20:30:06.916244Z WARN screenpipe_audio::core::source_buffer: [MacBook Pro Microphone (input)] large gap on wired device: 81.4ms elapsed (expected 5.3ms) → inserting 76.0ms silence (7299 samples)\n2026-05-06T20:30:29.881247Z WARN screenpipe_audio::core::source_buffer: [MacBook Pro Microphone (input)] large gap on wired device: 96.0ms elapsed (expected 5.3ms) → inserting 90.7ms silence (8704 samples)","depth":4,"on_screen":true,"value":"-rw-r--r-- 1 lukas staff 950993 28 Apr 17:45 compact_monitor_2_1777387552842.mp4\n-rw-r--r-- 1 lukas staff 429007 28 Apr 17:51 compact_monitor_2_1777387889075.mp4\n-rw-r--r-- 1 lukas staff 884099 28 Apr 17:57 compact_monitor_2_1777388218623.mp4\n-rw-r--r-- 1 lukas staff 2352504 28 Apr 18:02 compact_monitor_2_1777388548021.mp4\n-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4\n-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4\n-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4\n-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4\n-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4\n-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4\n-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4\n-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4\n-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4\n-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4\n-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4\n-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4\n-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4\n-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4\n-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22523176\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 28 Apr 16:51 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite\n-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27 \n[2026-05-06 18:58:18] ========================================\n[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 18:58:18] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m04s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m06s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m07s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)\n frames (7543 rows) ⠴ % \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27\n[2026-05-06 19:22:16] ========================================\n[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 19:22:16] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m01s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m03s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ✓ 4m40s\n ocr_text (2193 rows) ✓ 0m25s\n ui_events (9909 rows) ✓ 0m02s\n elements (470235 rows) ✓ 2m46s\n meetings (3 rows) ✓ 0m00s\n\n[+08m07s] ▶ Updating FTS indexes\n elements_fts ✓ 2m59s\n frames_fts ✓ 6m07s\n ui_events_fts ✓ 0m03s\n\n[+17m16s] ▶ Verifying DB\n frames: 7543 / 7543 ✓\n elements: 470235 / 470235 ✓\n ui_events: 9909 / 9909 ✓\n ocr_text: 2193 / 2193 ✓\n meetings: 3 / 3 ✓\n\n[+18m46s] ▶ Copying data folder for 2026-04-27\n rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)\n\n[2026-05-06 19:41:28] Archive DB size: 9.7G\n[2026-05-06 19:41:28] Total time: 19m12s\n[2026-05-06 19:41:28] Sync complete for 2026-04-27\n[2026-05-06 19:41:28] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28\n[2026-05-06 19:44:49] ========================================\n[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28\n[2026-05-06 19:44:49] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (9.7G)\n Data dir: OK (223 files, 159M)\n\n[+00m00s] ▶ Counting source rows for 2026-04-28\n frames: 4535\n elements: 407532\n ui_events: 8621\n ocr_text: 1623\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m00s\n creating FTS tables ✓ 0m00s\n\n[+00m02s] ▶ Syncing data for 2026-04-28\n video_chunks ✓ 0m12s\n frames (4535 rows) ✓ 1m30s\n ocr_text (1623 rows) ✓ 0m32s\n ui_events (8621 rows) ✓ 0m01s\n elements (407532 rows) ✓ 1m02s\n meetings (3 rows) ✓ 0m00s\n\n[+03m19s] ▶ Updating FTS indexes\n elements_fts ✓ 1m36s\n frames_fts ✓ 2m28s\n ui_events_fts ✓ 0m04s\n\n[+07m27s] ▶ Verifying DB\n frames: 4535 / 4535 ✓\n elements: 407532 / 407532 ✓\n ui_events: 8621 / 8621 ✓\n ocr_text: 1623 / 1623 ✓\n meetings: 3 / 3 ✓\n\n[+08m59s] ▶ Copying data folder for 2026-04-28\n rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)\n\n[2026-05-06 19:54:08] Archive DB size: 10G\n[2026-05-06 19:54:08] Total time: 9m19s\n[2026-05-06 19:54:08] Sync complete for 2026-04-28\n[2026-05-06 19:54:08] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll\ntotal 24\ndrwx------ 9 lukas staff 288 28 Apr 09:18 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\ndrwx------ 5 lukas staff 160 1 Nov 2021 _cacache\ndrwx------@ 2 lukas staff 64 28 Apr 09:18 _locks\ndrwx------ 15 lukas staff 480 27 Apr 19:54 _logs\ndrwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx\n-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked\n-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json\n-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll \ntotal 52920\ndrwx------+ 92 lukas staff 2944 6 May 20:22 .\ndrwxr-xr-x 5 root admin 160 23 Aug 2024 ..\n-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding\n-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store\ndrwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash\ndrwx------ 5 lukas staff 160 1 Nov 2021 .aws\n-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json\n-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history\n-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc\ndrwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito\ndrwx------@ 6 lukas staff 192 9 Apr 19:53 .cache\ndrwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude\n-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json\ndrwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium\ndrwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer\ndrwx------ 16 lukas staff 512 21 May 2025 .config\ndrwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue\ndrwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot\ndrwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor\ndrwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor\ndrwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona\ndrwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb\ndrwx------ 24 lukas staff 768 27 Apr 18:14 .docker\ndrwx------ 15 lukas staff 480 6 Jun 2023 .dropbox\ndrwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak\n-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth\n-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig\n-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp\ndrwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon\ndrwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc\n-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst\ndrwx------ 5 lukas staff 160 23 Dec 2024 .local\n-rw------- 1 lukas staff 204 16 Mar 2024 .netrc\ndrwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp\n-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history\n-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer\ndrwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py\ndrwx------ 8 lukas staff 256 6 May 20:24 .npm\n-rw------- 1 lukas staff 74 20 May 2024 .npmrc\ndrwx------ 32 lukas staff 1024 25 Jul 2025 .nvm\ndrwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile\n-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history\ndrwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode\ndrwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight\ndrwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint\ndrwx------ 15 lukas staff 480 8 Aug 2025 .ssh\ndrwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit\ndrwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm\n-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\n UW PICO 5.09 New Buffer \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n [ Read 1 line ] \n^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos \n^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell \ndrwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm\ndrwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf\ndrwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn\n-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc\n-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile\n-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy\n-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave\n-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save\n-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees\n-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc\ndrwx------@ 9 lukas staff 288 20 Apr 20:55 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV\ndrwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads\ndrwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen\ndrwx------@ 112 lukas staff 3584 2 Dec 09:19 Library\ndrwx------ 7 lukas staff 224 12 Feb 2024 Movies\ndrwx------+ 5 lukas staff 160 25 Sep 2023 Music\ndrwx------+ 9 lukas staff 288 25 Sep 2023 Pictures\ndrwx------ 3 lukas staff 96 8 Nov 2021 Postman\ndrwx------+ 4 lukas staff 128 28 Oct 2021 Public\n-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf\ndrwx------ 4 lukas staff 128 2 Jul 2023 Users\n-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log\n-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 2025 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast\n-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin\n-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh\n-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe\ncd: no such file or directory: /Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated\nchecking permissions...\n screen recording: ok\n microphone: ok\n accessibility: ok\n2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap\n2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update\n2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits\n2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown\n2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export\n2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary\n2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ false │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n│ retention mode │ media-only (keep transcripts) │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ MacBook Pro Microphone (input) │\n│ │ System Audio (output) │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-05-06T20:27:34.638384Z INFO screenpipe: starting UI event capture\n2026-05-06T20:27:34.637679Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-05-06T20:27:34.649154Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(94))\n2026-05-06T20:27:34.652794Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-05-06T20:27:34.655839Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-05-06T20:27:34.673877Z INFO screenpipe_engine::ui_recorder: UI recording session started: 54869993-7b4b-491f-b717-2a583517f9c5\n2026-05-06T20:27:34.673910Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-05-06T20:27:34.674057Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-05-05 17:27:34.674056 UTC to 2026-05-06 17:27:34.674056 UTC)\n2026-05-06T20:27:34.674892Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-05-06T20:27:34.675788Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 0 frame entries, coverage from 2026-05-05 17:27:34.674056 UTC\n2026-05-06T20:27:34.686546Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-05-06T20:27:34.691371Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-05-06T20:27:36.270608Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-05-06T20:27:36.270669Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.270714Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.932583Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-05-06T20:27:36.932852Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-05-06T20:27:36.932882Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-05-06T20:27:36.932899Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-05-06T20:27:36.932901Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-05-06T20:27:39.158281Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 3 excluded)\n2026-05-06T20:27:39.593177Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1, dur=101ms\n2026-05-06T20:27:40.672366Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)\n2026-05-06T20:27:41.257664Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=2, dur=140ms\n2026-05-06T20:27:44.641022Z INFO screenpipe_audio::transcription::engine: whisper model available: \"/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin\"\n2026-05-06T20:27:44.641079Z INFO screenpipe_audio::transcription::whisper::model: whisper context: gpu acceleration enabled (Metal on macOS, Vulkan on Windows)\n2026-05-06T20:27:44.641086Z INFO screenpipe_audio::transcription::engine: loading whisper model with GPU acceleration...\nwhisper_init_from_file_with_params_no_state: loading model from '/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin'\nwhisper_init_with_params_no_state: use gpu = 1\nwhisper_init_with_params_no_state: flash attn = 0\nwhisper_init_with_params_no_state: gpu_device = 0\nwhisper_init_with_params_no_state: dtw = 0\nggml_metal_device_init: tensor API disabled for pre-M5 and pre-A19 devices\nggml_metal_library_init: using embedded metal library\nggml_metal_library_init: loaded in 0.041 sec\nggml_metal_rsets_init: creating a residency set collection (keep_alive = 180 s)\nggml_metal_device_init: GPU name: Apple M1\nggml_metal_device_init: GPU family: MTLGPUFamilyApple7 (1007)\nggml_metal_device_init: GPU family: MTLGPUFamilyCommon3 (3003)\nggml_metal_device_init: GPU family: MTLGPUFamilyMetal3 (5001)\nggml_metal_device_init: simdgroup reduction = true\nggml_metal_device_init: simdgroup matrix mul. = true\nggml_metal_device_init: has unified memory = true\nggml_metal_device_init: has bfloat = true\nggml_metal_device_init: has tensor = false\nggml_metal_device_init: use residency sets = true\nggml_metal_device_init: use shared buffers = true\nggml_metal_device_init: recommendedMaxWorkingSetSize = 11453.25 MB\nwhisper_init_with_params_no_state: devices = 3\nwhisper_init_with_params_no_state: backends = 3\nwhisper_model_load: loading model\nwhisper_model_load: n_vocab = 51865\nwhisper_model_load: n_audio_ctx = 1500\nwhisper_model_load: n_audio_state = 384\nwhisper_model_load: n_audio_head = 6\nwhisper_model_load: n_audio_layer = 4\nwhisper_model_load: n_text_ctx = 448\nwhisper_model_load: n_text_state = 384\nwhisper_model_load: n_text_head = 6\nwhisper_model_load: n_text_layer = 4\nwhisper_model_load: n_mels = 80\nwhisper_model_load: ftype = 1\nwhisper_model_load: qntvr = 0\nwhisper_model_load: type = 1 (tiny)\nwhisper_model_load: adding 1608 extra tokens\nwhisper_model_load: n_langs = 99\nwhisper_model_load: Metal total size = 77.11 MB\nwhisper_model_load: model size = 77.11 MB\n2026-05-06T20:27:44.857210Z INFO screenpipe_audio::transcription::engine: whisper model loaded successfully\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\n2026-05-06T20:27:44.861912Z INFO screenpipe_audio::audio_manager::manager: transcription session created (will be reused across segments)\n2026-05-06T20:27:44.862480Z INFO screenpipe_audio::audio_manager::manager: audio manager started\n2026-05-06T20:27:44.862525Z INFO screenpipe_audio::audio_manager::manager: calendar-assisted speaker diarization: listening for meeting events\n2026-05-06T20:27:47.831980Z INFO screenpipe_audio::device::device_manager: starting recording for device: System Audio (output)\n2026-05-06T20:27:47.832191Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for System Audio (output) (unknown / 30s segments)\n2026-05-06T20:27:47.906029Z INFO screenpipe_audio::device::device_manager: starting recording for device: MacBook Pro Microphone (input)\n2026-05-06T20:27:47.906090Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for MacBook Pro Microphone (input) (wired / 30s segments)\n2026-05-06T20:28:15.251258Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8608554010568040663, trigger=visual_change)\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\n2026-05-06T20:29:45.187551Z INFO screenpipe_audio::audio_manager::manager: reconciliation: transcribed 6 orphaned chunks\n2026-05-06T20:30:06.916244Z WARN screenpipe_audio::core::source_buffer: [MacBook Pro Microphone (input)] large gap on wired device: 81.4ms elapsed (expected 5.3ms) → inserting 76.0ms silence (7299 samples)\n2026-05-06T20:30:29.881247Z WARN screenpipe_audio::core::source_buffer: [MacBook Pro Microphone (input)] large gap on wired device: 96.0ms elapsed (expected 5.3ms) → inserting 90.7ms silence (8704 samples)","is_focused":true},{"role":"AXTextField","text":"you","depth":3,"bounds":{"left":0.64793885,"top":1.0,"width":0.0625,"height":-0.07581806},"on_screen":true,"automation_id":"_NS:65","value":"you","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.64860374,"top":1.0,"width":0.00831117,"height":-0.07581806},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.7017952,"top":1.0,"width":0.00731383,"height":-0.07581806},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.7130984,"top":1.0,"width":0.006981383,"height":-0.07661617},"on_screen":true,"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.7200798,"top":1.0,"width":0.006981383,"height":-0.07661617},"on_screen":true,"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.3487367,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.35073137,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.42719415,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42918882,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.58410907,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.58610374,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.6625665,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.66456115,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.4956782,"top":1.0,"width":0.027925532,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
7635447758729925822
|
3182944612367924289
|
visual_change
|
accessibility
|
NULL
|
-rw-r--r-- 1 lukas staff 950993 28 Apr 17:45 -rw-r--r-- 1 lukas staff 950993 28 Apr 17:45 compact_monitor_2_1777387552842.mp4
-rw-r--r-- 1 lukas staff 429007 28 Apr 17:51 compact_monitor_2_1777387889075.mp4
-rw-r--r-- 1 lukas staff 884099 28 Apr 17:57 compact_monitor_2_1777388218623.mp4
-rw-r--r-- 1 lukas staff 2352504 28 Apr 18:02 compact_monitor_2_1777388548021.mp4
-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4
-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4
-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4
-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4
-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4
-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4
-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4
-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4
-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4
-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4
-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4
-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4
-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4
-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4
-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22523176
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 28 Apr 16:51 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite
-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm
-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 18:58:18] ========================================
[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27
[2026-05-06 18:58:18] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m04s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m06s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m07s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)
frames (7543 rows) ⠴ %
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 19:22:16] ========================================
[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27
[2026-05-06 19:22:16] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m01s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m03s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ✓ 4m40s
ocr_text (2193 rows) ✓ 0m25s
ui_events (9909 rows) ✓ 0m02s
elements (470235 rows) ✓ 2m46s
meetings (3 rows) ✓ 0m00s
[+08m07s] ▶ Updating FTS indexes
elements_fts ✓ 2m59s
frames_fts ✓ 6m07s
ui_events_fts ✓ 0m03s
[+17m16s] ▶ Verifying DB
frames: 7543 / 7543 ✓
elements: 470235 / 470235 ✓
ui_events: 9909 / 9909 ✓
ocr_text: 2193 / 2193 ✓
meetings: 3 / 3 ✓
[+18m46s] ▶ Copying data folder for 2026-04-27
rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)
[2026-05-06 19:41:28] Archive DB size: 9.7G
[2026-05-06 19:41:28] Total time: 19m12s
[2026-05-06 19:41:28] Sync complete for 2026-04-27
[2026-05-06 19:41:28] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28
[2026-05-06 19:44:49] ========================================
[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28
[2026-05-06 19:44:49] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (9.7G)
Data dir: OK (223 files, 159M)
[+00m00s] ▶ Counting source rows for 2026-04-28
frames: 4535
elements: 407532
ui_events: 8621
ocr_text: 1623
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m00s
creating FTS tables ✓ 0m00s
[+00m02s] ▶ Syncing data for 2026-04-28
video_chunks ✓ 0m12s
frames (4535 rows) ✓ 1m30s
ocr_text (1623 rows) ✓ 0m32s
ui_events (8621 rows) ✓ 0m01s
elements (407532 rows) ✓ 1m02s
meetings (3 rows) ✓ 0m00s
[+03m19s] ▶ Updating FTS indexes
elements_fts ✓ 1m36s
frames_fts ✓ 2m28s
ui_events_fts ✓ 0m04s
[+07m27s] ▶ Verifying DB
frames: 4535 / 4535 ✓
elements: 407532 / 407532 ✓
ui_events: 8621 / 8621 ✓
ocr_text: 1623 / 1623 ✓
meetings: 3 / 3 ✓
[+08m59s] ▶ Copying data folder for 2026-04-28
rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)
[2026-05-06 19:54:08] Archive DB size: 10G
[2026-05-06 19:54:08] Total time: 9m19s
[2026-05-06 19:54:08] Sync complete for 2026-04-28
[2026-05-06 19:54:08] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll
total 24
drwx------ 9 lukas staff 288 28 Apr 09:18 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
drwx------ 5 lukas staff 160 1 Nov 2021 _cacache
drwx------@ 2 lukas staff 64 28 Apr 09:18 _locks
drwx------ 15 lukas staff 480 27 Apr 19:54 _logs
drwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx
-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked
-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json
-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 52920
drwx------+ 92 lukas staff 2944 6 May 20:22 .
drwxr-xr-x 5 root admin 160 23 Aug 2024 ..
-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding
-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store
drwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash
drwx------ 5 lukas staff 160 1 Nov 2021 .aws
-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json
-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history
-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc
drwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito
drwx------@ 6 lukas staff 192 9 Apr 19:53 .cache
drwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude
-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json
drwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium
drwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer
drwx------ 16 lukas staff 512 21 May 2025 .config
drwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue
drwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot
drwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor
drwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor
drwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona
drwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb
drwx------ 24 lukas staff 768 27 Apr 18:14 .docker
drwx------ 15 lukas staff 480 6 Jun 2023 .dropbox
drwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak
-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth
-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig
-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp
drwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon
drwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc
-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst
drwx------ 5 lukas staff 160 23 Dec 2024 .local
-rw------- 1 lukas staff 204 16 Mar 2024 .netrc
drwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp
-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history
-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer
drwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py
drwx------ 8 lukas staff 256 6 May 20:24 .npm
-rw------- 1 lukas staff 74 20 May 2024 .npmrc
drwx------ 32 lukas staff 1024 25 Jul 2025 .nvm
drwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile
-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history
drwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode
drwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight
drwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint
drwx------ 15 lukas staff 480 8 Aug 2025 .ssh
drwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit
drwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm
-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
UW PICO 5.09 New Buffer
[ Read 1 line ]
^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos
^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell
drwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm
drwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf
drwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn
-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc
-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile
-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy
-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave
-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save
-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees
-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc
drwx------@ 9 lukas staff 288 20 Apr 20:55 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV
drwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads
drwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen
drwx------@ 112 lukas staff 3584 2 Dec 09:19 Library
drwx------ 7 lukas staff 224 12 Feb 2024 Movies
drwx------+ 5 lukas staff 160 25 Sep 2023 Music
drwx------+ 9 lukas staff 288 25 Sep 2023 Pictures
drwx------ 3 lukas staff 96 8 Nov 2021 Postman
drwx------+ 4 lukas staff 128 28 Oct 2021 Public
-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf
drwx------ 4 lukas staff 128 2 Jul 2023 Users
-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log
-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log
-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4
-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 2025 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast
-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin
-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh
-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
cd: no such file or directory: /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated
checking permissions...
screen recording: ok
microphone: ok
accessibility: ok
2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap
2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update
2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits
2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown
2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export
2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary
2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ false │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 7 │
│ retention mode │ media-only (keep transcripts) │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ MacBook Pro Microphone (input) │
│ │ System Audio (output) │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: https://github.com/screenpipe/screenpipe/releases
2026-05-06T20:27:34.638384Z INFO screenpipe: starting UI event capture
2026-05-06T20:27:34.637679Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-05-06T20:27:34.649154Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(94))
2026-05-06T20:27:34.652794Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh
2026-05-06T20:27:34.655839Z INFO screenpipe_engine::ui_recorder: Starting UI event capture
2026-05-06T20:27:34.673877Z INFO screenpipe_engine::ui_recorder: UI recording session started: 54869993-7b4b-491f-b717-2a583517f9c5
2026-05-06T20:27:34.673910Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)
2026-05-06T20:27:34.674057Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-05-05 17:27:34.674056 UTC to 2026-05-06 17:27:34.674056 UTC)
2026-05-06T20:27:34.674892Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)
2026-05-06T20:27:34.675788Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 0 frame entries, coverage from 2026-05-05 17:27:34.674056 UTC
2026-05-06T20:27:34.686546Z INFO screenpipe_engine::server: Server listening on [IP_ADDRESS]:3030
2026-05-06T20:27:34.691371Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030
2026-05-06T20:27:36.270608Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)
2026-05-06T20:27:36.270669Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)
2026-05-06T20:27:36.270714Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)
2026-05-06T20:27:36.932583Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)
2026-05-06T20:27:36.932852Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)
2026-05-06T20:27:36.932882Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)
2026-05-06T20:27:36.932899Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)
2026-05-06T20:27:36.932901Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)
2026-05-06T20:27:39.158281Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 3 excluded)
2026-05-06T20:27:39.593177Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1, dur=101ms
2026-05-06T20:27:40.672366Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)
2026-05-06T20:27:41.257664Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=2, dur=140ms
2026-05-06T20:27:44.641022Z INFO screenpipe_audio::transcription::engine: whisper model available: "/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin"
2026-05-06T20:27:44.641079Z INFO screenpipe_audio::transcription::whisper::model: whisper context: gpu acceleration enabled (Metal on macOS, Vulkan on Windows)
2026-05-06T20:27:44.641086Z INFO screenpipe_audio::transcription::engine: loading whisper model with GPU acceleration...
whisper_init_from_file_with_params_no_state: loading model from '/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin'
whisper_init_with_params_no_state: use gpu = 1
whisper_init_with_params_no_state: flash attn = 0
whisper_init_with_params_no_state: gpu_device = 0
whisper_init_with_params_no_state: dtw = 0
ggml_metal_device_init: tensor API disabled for pre-M5 and pre-A19 devices
ggml_metal_library_init: using embedded metal library
ggml_metal_library_init: loaded in 0.041 sec
ggml_metal_rsets_init: creating a residency set collection (keep_alive = 180 s)
ggml_metal_device_init: GPU name: Apple M1
ggml_metal_device_init: GPU family: MTLGPUFamilyApple7 (1007)
ggml_metal_device_init: GPU family: MTLGPUFamilyCommon3 (3003)
ggml_metal_device_init: GPU family: MTLGPUFamilyMetal3 (5001)
ggml_metal_device_init: simdgroup reduction = true
ggml_metal_device_init: simdgroup matrix mul. = true
ggml_metal_device_init: has unified memory = true
ggml_metal_device_init: has bfloat = true
ggml_metal_device_init: has tensor = false
ggml_metal_device_init: use residency sets = true
ggml_metal_device_init: use shared buffers = true
ggml_metal_device_init: recommendedMaxWorkingSetSize = 11453.25 MB
whisper_init_with_params_no_state: devices = 3
whisper_init_with_params_no_state: backends = 3
whisper_model_load: loading model
whisper_model_load: n_vocab = 51865
whisper_model_load: n_audio_ctx = 1500
whisper_model_load: n_audio_state = 384
whisper_model_load: n_audio_head = 6
whisper_model_load: n_audio_layer = 4
whisper_model_load: n_text_ctx = 448
whisper_model_load: n_text_state = 384
whisper_model_load: n_text_head = 6
whisper_model_load: n_text_layer = 4
whisper_model_load: n_mels = 80
whisper_model_load: ftype = 1
whisper_model_load: qntvr = 0
whisper_model_load: type = 1 (tiny)
whisper_model_load: adding 1608 extra tokens
whisper_model_load: n_langs = 99
whisper_model_load: Metal total size = 77.11 MB
whisper_model_load: model size = 77.11 MB
2026-05-06T20:27:44.857210Z INFO screenpipe_audio::transcription::engine: whisper model loaded successfully
whisper_backend_init_gpu: device 0: Metal (type: 1)
whisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)
whisper_backend_init_gpu: using Metal backend
ggml_metal_init: allocating
ggml_metal_init: found device: Apple M1
ggml_metal_init: picking default device: Apple M1
ggml_metal_init: use fusion = true
ggml_metal_init: use concurrency = true
ggml_metal_init: use graph optimize = true
whisper_backend_init: using BLAS backend
whisper_init_state: kv self size = 3.15 MB
whisper_init_state: kv cross size = 9.44 MB
whisper_init_state: kv pad size = 2.36 MB
whisper_init_state: compute buffer (conv) = 14.17 MB
whisper_init_state: compute buffer (encode) = 65.96 MB
whisper_init_state: compute buffer (cross) = 8.50 MB
whisper_init_state: compute buffer (decode) = 96.83 MB
2026-05-06T20:27:44.861912Z INFO screenpipe_audio::audio_manager::manager: transcription session created (will be reused across segments)
2026-05-06T20:27:44.862480Z INFO screenpipe_audio::audio_manager::manager: audio manager started
2026-05-06T20:27:44.862525Z INFO screenpipe_audio::audio_manager::manager: calendar-assisted speaker diarization: listening for meeting events
2026-05-06T20:27:47.831980Z INFO screenpipe_audio::device::device_manager: starting recording for device: System Audio (output)
2026-05-06T20:27:47.832191Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for System Audio (output) (unknown / 30s segments)
2026-05-06T20:27:47.906029Z INFO screenpipe_audio::device::device_manager: starting recording for device: MacBook Pro Microphone (input)
2026-05-06T20:27:47.906090Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for MacBook Pro Microphone (input) (wired / 30s segments)
2026-05-06T20:28:15.251258Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8608554010568040663, trigger=visual_change)
whisper_backend_init_gpu: device 0: Metal (type: 1)
whisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)
whisper_backend_init_gpu: using Metal backend
ggml_metal_init: allocating
ggml_metal_init: found device: Apple M1
ggml_metal_init: picking default device: Apple M1
ggml_metal_init: use fusion = true
ggml_metal_init: use concurrency = true
ggml_metal_init: use graph optimize = true
whisper_backend_init: using BLAS backend
whisper_init_state: kv self size = 3.15 MB
whisper_init_state: kv cross size = 9.44 MB
whisper_init_state: kv pad size = 2.36 MB
whisper_init_state: compute buffer (conv) = 14.17 MB
whisper_init_state: compute buffer (encode) = 65.96 MB
whisper_init_state: compute buffer (cross) = 8.50 MB
whisper_init_state: compute buffer (decode) = 96.83 MB
ggml_metal_free: deallocating
whisper_backend_init_gpu: device 0: Metal (type: 1)
whisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)
whisper_backend_init_gpu: using Metal backend
ggml_metal_init: allocating
ggml_metal_init: found device: Apple M1
ggml_metal_init: picking default device: Apple M1
ggml_metal_init: use fusion = true
ggml_metal_init: use concurrency = true
ggml_metal_init: use graph optimize = true
whisper_backend_init: using BLAS backend
whisper_init_state: kv self size = 3.15 MB
whisper_init_state: kv cross size = 9.44 MB
whisper_init_state: kv pad size = 2.36 MB
whisper_init_state: compute buffer (conv) = 14.17 MB
whisper_init_state: compute buffer (encode) = 65.96 MB
whisper_init_state: compute buffer (cross) = 8.50 MB
whisper_init_state: compute buffer (decode) = 96.83 MB
ggml_metal_free: deallocating
whisper_backend_init_gpu: device 0: Metal (type: 1)
whisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)
whisper_backend_init_gpu: using Metal backend
ggml_metal_init: allocating
ggml_metal_init: found device: Apple M1
ggml_metal_init: picking default device: Apple M1
ggml_metal_init: use fusion = true
ggml_metal_init: use concurrency = true
ggml_metal_init: use graph optimize = true
whisper_backend_init: using BLAS backend
whisper_init_state...
|
49
|
NULL
|
|
52
|
3
|
12
|
2026-05-06T17:31:43.280460+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778088703280_m1.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 -rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4
-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4
-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4
-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4
-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4
-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4
-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4
-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4
-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4
-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4
-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4
-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4
-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4
-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4
-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22523176
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 28 Apr 16:51 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite
-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm
-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 18:58:18] ========================================
[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27
[2026-05-06 18:58:18] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m04s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m06s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m07s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)
frames (7543 rows) ⠴ %
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 19:22:16] ========================================
[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27
[2026-05-06 19:22:16] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m01s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m03s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ✓ 4m40s
ocr_text (2193 rows) ✓ 0m25s
ui_events (9909 rows) ✓ 0m02s
elements (470235 rows) ✓ 2m46s
meetings (3 rows) ✓ 0m00s
[+08m07s] ▶ Updating FTS indexes
elements_fts ✓ 2m59s
frames_fts ✓ 6m07s
ui_events_fts ✓ 0m03s
[+17m16s] ▶ Verifying DB
frames: 7543 / 7543 ✓
elements: 470235 / 470235 ✓
ui_events: 9909 / 9909 ✓
ocr_text: 2193 / 2193 ✓
meetings: 3 / 3 ✓
[+18m46s] ▶ Copying data folder for 2026-04-27
rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)
[2026-05-06 19:41:28] Archive DB size: 9.7G
[2026-05-06 19:41:28] Total time: 19m12s
[2026-05-06 19:41:28] Sync complete for 2026-04-27
[2026-05-06 19:41:28] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28
[2026-05-06 19:44:49] ========================================
[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28
[2026-05-06 19:44:49] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (9.7G)
Data dir: OK (223 files, 159M)
[+00m00s] ▶ Counting source rows for 2026-04-28
frames: 4535
elements: 407532
ui_events: 8621
ocr_text: 1623
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m00s
creating FTS tables ✓ 0m00s
[+00m02s] ▶ Syncing data for 2026-04-28
video_chunks ✓ 0m12s
frames (4535 rows) ✓ 1m30s
ocr_text (1623 rows) ✓ 0m32s
ui_events (8621 rows) ✓ 0m01s
elements (407532 rows) ✓ 1m02s
meetings (3 rows) ✓ 0m00s
[+03m19s] ▶ Updating FTS indexes
elements_fts ✓ 1m36s
frames_fts ✓ 2m28s
ui_events_fts ✓ 0m04s
[+07m27s] ▶ Verifying DB
frames: 4535 / 4535 ✓
elements: 407532 / 407532 ✓
ui_events: 8621 / 8621 ✓
ocr_text: 1623 / 1623 ✓
meetings: 3 / 3 ✓
[+08m59s] ▶ Copying data folder for 2026-04-28
rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)
[2026-05-06 19:54:08] Archive DB size: 10G
[2026-05-06 19:54:08] Total time: 9m19s
[2026-05-06 19:54:08] Sync complete for 2026-04-28
[2026-05-06 19:54:08] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll
total 24
drwx------ 9 lukas staff 288 28 Apr 09:18 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
drwx------ 5 lukas staff 160 1 Nov 2021 _cacache
drwx------@ 2 lukas staff 64 28 Apr 09:18 _locks
drwx------ 15 lukas staff 480 27 Apr 19:54 _logs
drwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx
-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked
-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json
-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 52920
drwx------+ 92 lukas staff 2944 6 May 20:22 .
drwxr-xr-x 5 root admin 160 23 Aug 2024 ..
-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding
-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store
drwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash
drwx------ 5 lukas staff 160 1 Nov 2021 .aws
-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json
-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history
-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc
drwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito
drwx------@ 6 lukas staff 192 9 Apr 19:53 .cache
drwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude
-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json
drwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium
drwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer
drwx------ 16 lukas staff 512 21 May 2025 .config
drwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue
drwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot
drwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor
drwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor
drwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona
drwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb
drwx------ 24 lukas staff 768 27 Apr 18:14 .docker
drwx------ 15 lukas staff 480 6 Jun 2023 .dropbox
drwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak
-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth
-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig
-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp
drwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon
drwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc
-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst
drwx------ 5 lukas staff 160 23 Dec 2024 .local
-rw------- 1 lukas staff 204 16 Mar 2024 .netrc
drwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp
-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history
-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer
drwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py
drwx------ 8 lukas staff 256 6 May 20:24 .npm
-rw------- 1 lukas staff 74 20 May 2024 .npmrc
drwx------ 32 lukas staff 1024 25 Jul 2025 .nvm
drwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile
-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history
drwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode
drwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight
drwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint
drwx------ 15 lukas staff 480 8 Aug 2025 .ssh
drwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit
drwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm
-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
UW PICO 5.09 New Buffer
[ Read 1 line ]
^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos
^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell
drwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm
drwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf
drwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn
-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc
-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile
-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy
-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave
-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save
-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees
-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc
drwx------@ 9 lukas staff 288 20 Apr 20:55 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV
drwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads
drwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen
drwx------@ 112 lukas staff 3584 2 Dec 09:19 Library
drwx------ 7 lukas staff 224 12 Feb 2024 Movies
drwx------+ 5 lukas staff 160 25 Sep 2023 Music
drwx------+ 9 lukas staff 288 25 Sep 2023 Pictures
drwx------ 3 lukas staff 96 8 Nov 2021 Postman
drwx------+ 4 lukas staff 128 28 Oct 2021 Public
-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf
drwx------ 4 lukas staff 128 2 Jul 2023 Users
-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log
-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log
-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4
-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 2025 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast
-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin
-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh
-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
cd: no such file or directory: /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated
checking permissions...
screen recording: ok
microphone: ok
accessibility: ok
2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap
2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update
2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits
2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown
2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export
2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary
2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ false │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 7 │
│ retention mode │ media-only (keep transcripts) │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ MacBook Pro Microphone (input) │
│ │ System Audio (output) │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: https://github.com/screenpipe/screenpipe/releases
2026-05-06T20:27:34.638384Z INFO screenpipe: starting UI event capture
2026-05-06T20:27:34.637679Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-05-06T20:27:34.649154Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(94))
2026-05-06T20:27:34.652794Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh
2026-05-06T20:27:34.655839Z INFO screenpipe_engine::ui_recorder: Starting UI event capture
2026-05-06T20:27:34.673877Z INFO screenpipe_engine::ui_recorder: UI recording session started: 54869993-7b4b-491f-b717-2a583517f9c5
2026-05-06T20:27:34.673910Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)
2026-05-06T20:27:34.674057Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-05-05 17:27:34.674056 UTC to 2026-05-06 17:27:34.674056 UTC)
2026-05-06T20:27:34.674892Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)
2026-05-06T20:27:34.675788Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 0 frame entries, coverage from 2026-05-05 17:27:34.674056 UTC
2026-05-06T20:27:34.686546Z INFO screenpipe_engine::server: Server listening on [IP_ADDRESS]:3030
2026-05-06T20:27:34.691371Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030
2026-05-06T20:27:36.270608Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)
2026-05-06T20:27:36.270669Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)
2026-05-06T20:27:36.270714Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)
2026-05-06T20:27:36.932583Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)
2026-05-06T20:27:36.932852Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)
2026-05-06T20:27:36.932882Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)
2026-05-06T20:27:36.932899Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)
2026-05-06T20:27:36.932901Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)
2026-05-06T20:27:39.158281Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 3 excluded)
2026-05-06T20:27:39.593177Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1, dur=101ms
2026-05-06T20:27:40.672366Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)
2026-05-06T20:27:41.257664Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=2, dur=140ms
2026-05-06T20:27:44.641022Z INFO screenpipe_audio::transcription::engine: whisper model available: "/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin"
2026-05-06T20:27:44.641079Z INFO screenpipe_audio::transcription::whisper::model: whisper context: gpu acceleration enabled (Metal on macOS, Vulkan on Windows)
2026-05-06T20:27:44.641086Z INFO screenpipe_audio::transcription::engine: loading whisper model with GPU acceleration...
whisper_init_from_file_with_params_no_state: loading model from '/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin'
whisper_init_with_params_no_state: use gpu = 1
whisper_init_with_params_no_state: flash attn = 0
whisper_init_with_params_no_state: gpu_device = 0
whisper_init_with_params_no_state: dtw = 0
ggml_metal_device_init: tensor API disabled for pre-M5 and pre-A19 devices
ggml_metal_library_init: using embedded metal library
ggml_metal_library_init: loaded in 0.041 sec
ggml_metal_rsets_init: creating a residency set collection (keep_alive = 180 s)
ggml_metal_device_init: GPU name: Apple M1
ggml_metal_device_init: GPU family: MTLGPUFamilyApple7 (1007)
ggml_metal_device_init: GPU family: MTLGPUFamilyCommon3 (3003)
ggml_metal_device_init: GPU family: MTLGPUFamilyMetal3 (5001)
ggml_metal_device_init: simdgroup reduction = true
ggml_metal_device_init: simdgroup matrix mul. = true
ggml_metal_device_init: has unified memory = true
ggml_metal_device_init: has bfloat = true
ggml_metal_device_init: has tensor = false
ggml_metal_device_init: use residency sets = true
ggml_metal_device_init: use shared buffers = true
ggml_metal_device_init: recommendedMaxWorkingSetSize = 11453.25 MB
whisper_init_with_params_no_state: devices = 3
whisper_init_with_params_no_state: backends = 3
whisper_model_load: loading model
whisper_model_load: n_vocab = 51865
whisper_model_load: n_audio_ctx = 1500
whisper_model_load: n_audio_state = 384
whisper_model_load: n_audio_head = 6
whisper_model_load: n_audio_layer = 4
whisper_model_load: n_text_ctx = 448
whisper_model_load: n_text_state = 384
whisper_model_load: n_text_head = 6
whisper_model_load: n_text_layer = 4
whisper_model_load: n_mels = 80
whisper_model_load: ftype = 1
whisper_model_load: qntvr = 0
whisper_model_load: type = 1 (tiny)
whisper_model_load: adding 1608 extra tokens
whisper_model_load: n_langs = 99
whisper_model_load: Metal total size = 77.11 MB
whisper_model_load: model size = 77.11 MB
2026-05-06T20:27:44.857210Z INFO screenpipe_audio::transcription::engine: whisper model loaded successfully
whisper_backend_init_gpu: device 0: Metal (type: 1)
whisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)
whisper_backend_init_gpu: using Metal backend
ggml_metal_init: allocating
ggml_metal_init: found device: Apple M1
ggml_metal_init: picking default device: Apple M1
ggml_metal_init: use fusion = true
ggml_metal_init: use concurrency = true
ggml_metal_init: use graph optimize = true
whisper_backend_init: using BLAS backend
whisper_init_state: kv self size = 3.15 MB
whisper_init_state: kv cross size = 9.44 MB
whisper_init_state: kv pad size = 2.36 MB
whisper_init_state: compute buffer (conv) = 14.17 MB
whisper_init_state: compute buffer (encode) = 65.96 MB
whisper_init_state: compute buffer (cross) = 8.50 MB
whisper_init_state: compute buffer (decode) = 96.83 MB
2026-05-06T20:27:44.861912Z INFO screenpipe_audio::audio_manager::manager: transcription session created (will be reused across segments)
2026-05-06T20:27:44.862480Z INFO screenpipe_audio::audio_manager::manager: audio manager started
2026-05-06T20:27:44.862525Z INFO screenpipe_audio::audio_manager::manager: calendar-assisted speaker diarization: listening for meeting events
2026-05-06T20:27:47.831980Z INFO screenpipe_audio::device::device_manager: starting recording for device: System Audio (output)
2026-05-06T20:27:47.832191Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for System Audio (output) (unknown / 30s segments)
2026-05-06T20:27:47.906029Z INFO screenpipe_audio::device::device_manager: starting recording for device: MacBook Pro Microphone (input)
2026-05-06T20:27:47.906090Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for MacBook Pro Microphone (input) (wired / 30s segments)
2026-05-06T20:28:15.251258Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8608554010568040663, trigger=visual_change)
whisper_backend_init_gpu: device 0: Metal (type: 1)
whisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)
whisper_backend_init_gpu: using Metal backend
ggml_metal_init: allocating
ggml_metal_init: found device: Apple M1
ggml_metal_init: picking default device: Apple M1
ggml_metal_init: use fusion = true
ggml_metal_init: use concurrency = true
ggml_metal_init: use graph optimize = true
whisper_backend_init: using BLAS backend
whisper_init_state: kv self size = 3.15 MB
whisper_init_state: kv cross size = 9.44 MB
whisper_init_state: kv pad size = 2.36 MB
whisper_init_state: compute buffer (conv) = 14.17 MB
whisper_init_state: compute buffer (encode) = 65.96 MB
whisper_init_state: compute buffer (cross) = 8.50 MB
whisper_init_state: compute buffer (decode) = 96.83 MB
ggml_metal_free: deallocating
whisper_backend_init_gpu: device 0: Metal (type: 1)
whisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)
whisper_backend_init_gpu: using Metal backend
ggml_metal_init: allocating
ggml_metal_init: found device: Apple M1
ggml_metal_init: picking default device: Apple M1
ggml_metal_init: use fusion = true
ggml_metal_init: use concurrency = true
ggml_metal_init: use graph optimize = true
whisper_backend_init: using BLAS backend
whisper_init_state: kv self size = 3.15 MB
whisper_init_state: kv cross size = 9.44 MB
whisper_init_state: kv pad size = 2.36 MB
whisper_init_state: compute buffer (conv) = 14.17 MB
whisper_init_state: compute buffer (encode) = 65.96 MB
whisper_init_state: compute buffer (cross) = 8.50 MB
whisper_init_state: compute buffer (decode) = 96.83 MB
ggml_metal_free: deallocating
whisper_backend_init_gpu: device 0: Metal (type: 1)
whisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)
whisper_backend_init_gpu: using Metal backend
ggml_metal_init: allocating
ggml_metal_init: found device: Apple M1
ggml_metal_init: picking default device: Apple M1
ggml_metal_init: use fusion = true
ggml_metal_init: use concurrency = true
ggml_metal_init: use graph optimize = true
whisper_backend_init: using BLAS backend
whisper_init_state: kv self size = 3.15 MB
whisper_init_state: kv cross size = 9.44 MB
whisper_init_state: kv pad size = 2.36 MB
whisper_init_state: compute buffer (conv) = 14.17 MB
whisper_init_state: compute buffer (encode) = 65.96 MB
whisper_init_state: compute buffer (cross) = 8.50 MB
whisper_init_state: compute buffer (decode) = 96.83 ...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4\n-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4\n-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4\n-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4\n-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4\n-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4\n-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4\n-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4\n-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4\n-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4\n-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4\n-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4\n-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4\n-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4\n-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22523176\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 28 Apr 16:51 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite\n-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27 \n[2026-05-06 18:58:18] ========================================\n[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 18:58:18] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m04s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m06s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m07s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)\n frames (7543 rows) ⠴ % \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27\n[2026-05-06 19:22:16] ========================================\n[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 19:22:16] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m01s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m03s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ✓ 4m40s\n ocr_text (2193 rows) ✓ 0m25s\n ui_events (9909 rows) ✓ 0m02s\n elements (470235 rows) ✓ 2m46s\n meetings (3 rows) ✓ 0m00s\n\n[+08m07s] ▶ Updating FTS indexes\n elements_fts ✓ 2m59s\n frames_fts ✓ 6m07s\n ui_events_fts ✓ 0m03s\n\n[+17m16s] ▶ Verifying DB\n frames: 7543 / 7543 ✓\n elements: 470235 / 470235 ✓\n ui_events: 9909 / 9909 ✓\n ocr_text: 2193 / 2193 ✓\n meetings: 3 / 3 ✓\n\n[+18m46s] ▶ Copying data folder for 2026-04-27\n rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)\n\n[2026-05-06 19:41:28] Archive DB size: 9.7G\n[2026-05-06 19:41:28] Total time: 19m12s\n[2026-05-06 19:41:28] Sync complete for 2026-04-27\n[2026-05-06 19:41:28] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28\n[2026-05-06 19:44:49] ========================================\n[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28\n[2026-05-06 19:44:49] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (9.7G)\n Data dir: OK (223 files, 159M)\n\n[+00m00s] ▶ Counting source rows for 2026-04-28\n frames: 4535\n elements: 407532\n ui_events: 8621\n ocr_text: 1623\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m00s\n creating FTS tables ✓ 0m00s\n\n[+00m02s] ▶ Syncing data for 2026-04-28\n video_chunks ✓ 0m12s\n frames (4535 rows) ✓ 1m30s\n ocr_text (1623 rows) ✓ 0m32s\n ui_events (8621 rows) ✓ 0m01s\n elements (407532 rows) ✓ 1m02s\n meetings (3 rows) ✓ 0m00s\n\n[+03m19s] ▶ Updating FTS indexes\n elements_fts ✓ 1m36s\n frames_fts ✓ 2m28s\n ui_events_fts ✓ 0m04s\n\n[+07m27s] ▶ Verifying DB\n frames: 4535 / 4535 ✓\n elements: 407532 / 407532 ✓\n ui_events: 8621 / 8621 ✓\n ocr_text: 1623 / 1623 ✓\n meetings: 3 / 3 ✓\n\n[+08m59s] ▶ Copying data folder for 2026-04-28\n rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)\n\n[2026-05-06 19:54:08] Archive DB size: 10G\n[2026-05-06 19:54:08] Total time: 9m19s\n[2026-05-06 19:54:08] Sync complete for 2026-04-28\n[2026-05-06 19:54:08] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll\ntotal 24\ndrwx------ 9 lukas staff 288 28 Apr 09:18 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\ndrwx------ 5 lukas staff 160 1 Nov 2021 _cacache\ndrwx------@ 2 lukas staff 64 28 Apr 09:18 _locks\ndrwx------ 15 lukas staff 480 27 Apr 19:54 _logs\ndrwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx\n-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked\n-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json\n-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll \ntotal 52920\ndrwx------+ 92 lukas staff 2944 6 May 20:22 .\ndrwxr-xr-x 5 root admin 160 23 Aug 2024 ..\n-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding\n-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store\ndrwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash\ndrwx------ 5 lukas staff 160 1 Nov 2021 .aws\n-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json\n-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history\n-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc\ndrwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito\ndrwx------@ 6 lukas staff 192 9 Apr 19:53 .cache\ndrwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude\n-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json\ndrwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium\ndrwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer\ndrwx------ 16 lukas staff 512 21 May 2025 .config\ndrwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue\ndrwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot\ndrwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor\ndrwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor\ndrwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona\ndrwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb\ndrwx------ 24 lukas staff 768 27 Apr 18:14 .docker\ndrwx------ 15 lukas staff 480 6 Jun 2023 .dropbox\ndrwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak\n-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth\n-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig\n-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp\ndrwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon\ndrwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc\n-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst\ndrwx------ 5 lukas staff 160 23 Dec 2024 .local\n-rw------- 1 lukas staff 204 16 Mar 2024 .netrc\ndrwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp\n-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history\n-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer\ndrwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py\ndrwx------ 8 lukas staff 256 6 May 20:24 .npm\n-rw------- 1 lukas staff 74 20 May 2024 .npmrc\ndrwx------ 32 lukas staff 1024 25 Jul 2025 .nvm\ndrwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile\n-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history\ndrwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode\ndrwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight\ndrwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint\ndrwx------ 15 lukas staff 480 8 Aug 2025 .ssh\ndrwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit\ndrwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm\n-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\n UW PICO 5.09 New Buffer \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n [ Read 1 line ] \n^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos \n^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell \ndrwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm\ndrwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf\ndrwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn\n-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc\n-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile\n-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy\n-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave\n-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save\n-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees\n-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc\ndrwx------@ 9 lukas staff 288 20 Apr 20:55 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV\ndrwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads\ndrwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen\ndrwx------@ 112 lukas staff 3584 2 Dec 09:19 Library\ndrwx------ 7 lukas staff 224 12 Feb 2024 Movies\ndrwx------+ 5 lukas staff 160 25 Sep 2023 Music\ndrwx------+ 9 lukas staff 288 25 Sep 2023 Pictures\ndrwx------ 3 lukas staff 96 8 Nov 2021 Postman\ndrwx------+ 4 lukas staff 128 28 Oct 2021 Public\n-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf\ndrwx------ 4 lukas staff 128 2 Jul 2023 Users\n-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log\n-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 2025 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast\n-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin\n-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh\n-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe\ncd: no such file or directory: /Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated\nchecking permissions...\n screen recording: ok\n microphone: ok\n accessibility: ok\n2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap\n2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update\n2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits\n2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown\n2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export\n2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary\n2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ false │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n│ retention mode │ media-only (keep transcripts) │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ MacBook Pro Microphone (input) │\n│ │ System Audio (output) │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-05-06T20:27:34.638384Z INFO screenpipe: starting UI event capture\n2026-05-06T20:27:34.637679Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-05-06T20:27:34.649154Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(94))\n2026-05-06T20:27:34.652794Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-05-06T20:27:34.655839Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-05-06T20:27:34.673877Z INFO screenpipe_engine::ui_recorder: UI recording session started: 54869993-7b4b-491f-b717-2a583517f9c5\n2026-05-06T20:27:34.673910Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-05-06T20:27:34.674057Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-05-05 17:27:34.674056 UTC to 2026-05-06 17:27:34.674056 UTC)\n2026-05-06T20:27:34.674892Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-05-06T20:27:34.675788Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 0 frame entries, coverage from 2026-05-05 17:27:34.674056 UTC\n2026-05-06T20:27:34.686546Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-05-06T20:27:34.691371Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-05-06T20:27:36.270608Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-05-06T20:27:36.270669Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.270714Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.932583Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-05-06T20:27:36.932852Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-05-06T20:27:36.932882Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-05-06T20:27:36.932899Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-05-06T20:27:36.932901Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-05-06T20:27:39.158281Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 3 excluded)\n2026-05-06T20:27:39.593177Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1, dur=101ms\n2026-05-06T20:27:40.672366Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)\n2026-05-06T20:27:41.257664Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=2, dur=140ms\n2026-05-06T20:27:44.641022Z INFO screenpipe_audio::transcription::engine: whisper model available: \"/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin\"\n2026-05-06T20:27:44.641079Z INFO screenpipe_audio::transcription::whisper::model: whisper context: gpu acceleration enabled (Metal on macOS, Vulkan on Windows)\n2026-05-06T20:27:44.641086Z INFO screenpipe_audio::transcription::engine: loading whisper model with GPU acceleration...\nwhisper_init_from_file_with_params_no_state: loading model from '/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin'\nwhisper_init_with_params_no_state: use gpu = 1\nwhisper_init_with_params_no_state: flash attn = 0\nwhisper_init_with_params_no_state: gpu_device = 0\nwhisper_init_with_params_no_state: dtw = 0\nggml_metal_device_init: tensor API disabled for pre-M5 and pre-A19 devices\nggml_metal_library_init: using embedded metal library\nggml_metal_library_init: loaded in 0.041 sec\nggml_metal_rsets_init: creating a residency set collection (keep_alive = 180 s)\nggml_metal_device_init: GPU name: Apple M1\nggml_metal_device_init: GPU family: MTLGPUFamilyApple7 (1007)\nggml_metal_device_init: GPU family: MTLGPUFamilyCommon3 (3003)\nggml_metal_device_init: GPU family: MTLGPUFamilyMetal3 (5001)\nggml_metal_device_init: simdgroup reduction = true\nggml_metal_device_init: simdgroup matrix mul. = true\nggml_metal_device_init: has unified memory = true\nggml_metal_device_init: has bfloat = true\nggml_metal_device_init: has tensor = false\nggml_metal_device_init: use residency sets = true\nggml_metal_device_init: use shared buffers = true\nggml_metal_device_init: recommendedMaxWorkingSetSize = 11453.25 MB\nwhisper_init_with_params_no_state: devices = 3\nwhisper_init_with_params_no_state: backends = 3\nwhisper_model_load: loading model\nwhisper_model_load: n_vocab = 51865\nwhisper_model_load: n_audio_ctx = 1500\nwhisper_model_load: n_audio_state = 384\nwhisper_model_load: n_audio_head = 6\nwhisper_model_load: n_audio_layer = 4\nwhisper_model_load: n_text_ctx = 448\nwhisper_model_load: n_text_state = 384\nwhisper_model_load: n_text_head = 6\nwhisper_model_load: n_text_layer = 4\nwhisper_model_load: n_mels = 80\nwhisper_model_load: ftype = 1\nwhisper_model_load: qntvr = 0\nwhisper_model_load: type = 1 (tiny)\nwhisper_model_load: adding 1608 extra tokens\nwhisper_model_load: n_langs = 99\nwhisper_model_load: Metal total size = 77.11 MB\nwhisper_model_load: model size = 77.11 MB\n2026-05-06T20:27:44.857210Z INFO screenpipe_audio::transcription::engine: whisper model loaded successfully\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\n2026-05-06T20:27:44.861912Z INFO screenpipe_audio::audio_manager::manager: transcription session created (will be reused across segments)\n2026-05-06T20:27:44.862480Z INFO screenpipe_audio::audio_manager::manager: audio manager started\n2026-05-06T20:27:44.862525Z INFO screenpipe_audio::audio_manager::manager: calendar-assisted speaker diarization: listening for meeting events\n2026-05-06T20:27:47.831980Z INFO screenpipe_audio::device::device_manager: starting recording for device: System Audio (output)\n2026-05-06T20:27:47.832191Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for System Audio (output) (unknown / 30s segments)\n2026-05-06T20:27:47.906029Z INFO screenpipe_audio::device::device_manager: starting recording for device: MacBook Pro Microphone (input)\n2026-05-06T20:27:47.906090Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for MacBook Pro Microphone (input) (wired / 30s segments)\n2026-05-06T20:28:15.251258Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8608554010568040663, trigger=visual_change)\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\n2026-05-06T20:29:45.187551Z INFO screenpipe_audio::audio_manager::manager: reconciliation: transcribed 6 orphaned chunks\n2026-05-06T20:30:06.916244Z WARN screenpipe_audio::core::source_buffer: [MacBook Pro Microphone (input)] large gap on wired device: 81.4ms elapsed (expected 5.3ms) → inserting 76.0ms silence (7299 samples)\n2026-05-06T20:30:29.881247Z WARN screenpipe_audio::core::source_buffer: [MacBook Pro Microphone (input)] large gap on wired device: 96.0ms elapsed (expected 5.3ms) → inserting 90.7ms silence (8704 samples)\n^C2026-05-06T20:31:44.992913Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-05-06T20:31:44.993815Z INFO screenpipe_audio::device::device_manager: Stopping device: System Audio (output)\n2026-05-06T20:31:44.993845Z INFO screenpipe_audio::device::device_manager: Stopping device: System Audio (output)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","depth":4,"on_screen":true,"value":"-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4\n-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4\n-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4\n-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4\n-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4\n-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4\n-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4\n-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4\n-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4\n-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4\n-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4\n-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4\n-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4\n-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4\n-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22523176\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 28 Apr 16:51 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite\n-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27 \n[2026-05-06 18:58:18] ========================================\n[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 18:58:18] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m04s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m06s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m07s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)\n frames (7543 rows) ⠴ % \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27\n[2026-05-06 19:22:16] ========================================\n[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27\n[2026-05-06 19:22:16] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (7.7G)\n Data dir: OK (242 files, 325M)\n\n[+00m01s] ▶ Counting source rows for 2026-04-27\n frames: 7543\n elements: 470235\n ui_events: 9909\n ocr_text: 2193\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n\n[+00m03s] ▶ Syncing data for 2026-04-27\n video_chunks ✓ 0m11s\n frames (7543 rows) ✓ 4m40s\n ocr_text (2193 rows) ✓ 0m25s\n ui_events (9909 rows) ✓ 0m02s\n elements (470235 rows) ✓ 2m46s\n meetings (3 rows) ✓ 0m00s\n\n[+08m07s] ▶ Updating FTS indexes\n elements_fts ✓ 2m59s\n frames_fts ✓ 6m07s\n ui_events_fts ✓ 0m03s\n\n[+17m16s] ▶ Verifying DB\n frames: 7543 / 7543 ✓\n elements: 470235 / 470235 ✓\n ui_events: 9909 / 9909 ✓\n ocr_text: 2193 / 2193 ✓\n meetings: 3 / 3 ✓\n\n[+18m46s] ▶ Copying data folder for 2026-04-27\n rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)\n\n[2026-05-06 19:41:28] Archive DB size: 9.7G\n[2026-05-06 19:41:28] Total time: 19m12s\n[2026-05-06 19:41:28] Sync complete for 2026-04-27\n[2026-05-06 19:41:28] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28\n[2026-05-06 19:44:49] ========================================\n[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28\n[2026-05-06 19:44:49] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (9.7G)\n Data dir: OK (223 files, 159M)\n\n[+00m00s] ▶ Counting source rows for 2026-04-28\n frames: 4535\n elements: 407532\n ui_events: 8621\n ocr_text: 1623\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m00s\n creating FTS tables ✓ 0m00s\n\n[+00m02s] ▶ Syncing data for 2026-04-28\n video_chunks ✓ 0m12s\n frames (4535 rows) ✓ 1m30s\n ocr_text (1623 rows) ✓ 0m32s\n ui_events (8621 rows) ✓ 0m01s\n elements (407532 rows) ✓ 1m02s\n meetings (3 rows) ✓ 0m00s\n\n[+03m19s] ▶ Updating FTS indexes\n elements_fts ✓ 1m36s\n frames_fts ✓ 2m28s\n ui_events_fts ✓ 0m04s\n\n[+07m27s] ▶ Verifying DB\n frames: 4535 / 4535 ✓\n elements: 407532 / 407532 ✓\n ui_events: 8621 / 8621 ✓\n ocr_text: 1623 / 1623 ✓\n meetings: 3 / 3 ✓\n\n[+08m59s] ▶ Copying data folder for 2026-04-28\n rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)\n\n[2026-05-06 19:54:08] Archive DB size: 10G\n[2026-05-06 19:54:08] Total time: 9m19s\n[2026-05-06 19:54:08] Sync complete for 2026-04-28\n[2026-05-06 19:54:08] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll\ntotal 24\ndrwx------ 9 lukas staff 288 28 Apr 09:18 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\ndrwx------ 5 lukas staff 160 1 Nov 2021 _cacache\ndrwx------@ 2 lukas staff 64 28 Apr 09:18 _locks\ndrwx------ 15 lukas staff 480 27 Apr 19:54 _logs\ndrwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx\n-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked\n-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json\n-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll \ntotal 52920\ndrwx------+ 92 lukas staff 2944 6 May 20:22 .\ndrwxr-xr-x 5 root admin 160 23 Aug 2024 ..\n-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding\n-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store\ndrwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash\ndrwx------ 5 lukas staff 160 1 Nov 2021 .aws\n-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json\n-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history\n-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc\ndrwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito\ndrwx------@ 6 lukas staff 192 9 Apr 19:53 .cache\ndrwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude\n-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json\ndrwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium\ndrwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer\ndrwx------ 16 lukas staff 512 21 May 2025 .config\ndrwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue\ndrwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot\ndrwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor\ndrwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor\ndrwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona\ndrwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb\ndrwx------ 24 lukas staff 768 27 Apr 18:14 .docker\ndrwx------ 15 lukas staff 480 6 Jun 2023 .dropbox\ndrwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak\n-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth\n-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig\n-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp\ndrwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon\ndrwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc\n-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst\ndrwx------ 5 lukas staff 160 23 Dec 2024 .local\n-rw------- 1 lukas staff 204 16 Mar 2024 .netrc\ndrwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp\n-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history\n-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer\ndrwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py\ndrwx------ 8 lukas staff 256 6 May 20:24 .npm\n-rw------- 1 lukas staff 74 20 May 2024 .npmrc\ndrwx------ 32 lukas staff 1024 25 Jul 2025 .nvm\ndrwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile\n-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history\ndrwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode\ndrwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight\ndrwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint\ndrwx------ 15 lukas staff 480 8 Aug 2025 .ssh\ndrwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit\ndrwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm\n-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\n UW PICO 5.09 New Buffer \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n [ Read 1 line ] \n^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos \n^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell \ndrwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm\ndrwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf\ndrwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn\n-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc\n-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile\n-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy\n-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave\n-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save\n-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees\n-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc\ndrwx------@ 9 lukas staff 288 20 Apr 20:55 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV\ndrwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads\ndrwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen\ndrwx------@ 112 lukas staff 3584 2 Dec 09:19 Library\ndrwx------ 7 lukas staff 224 12 Feb 2024 Movies\ndrwx------+ 5 lukas staff 160 25 Sep 2023 Music\ndrwx------+ 9 lukas staff 288 25 Sep 2023 Pictures\ndrwx------ 3 lukas staff 96 8 Nov 2021 Postman\ndrwx------+ 4 lukas staff 128 28 Oct 2021 Public\n-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf\ndrwx------ 4 lukas staff 128 2 Jul 2023 Users\n-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log\n-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 2025 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast\n-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin\n-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh\n-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe\ncd: no such file or directory: /Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated\nchecking permissions...\n screen recording: ok\n microphone: ok\n accessibility: ok\n2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap\n2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update\n2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits\n2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown\n2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export\n2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary\n2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ false │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n│ retention mode │ media-only (keep transcripts) │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ MacBook Pro Microphone (input) │\n│ │ System Audio (output) │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-05-06T20:27:34.638384Z INFO screenpipe: starting UI event capture\n2026-05-06T20:27:34.637679Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-05-06T20:27:34.649154Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(94))\n2026-05-06T20:27:34.652794Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-05-06T20:27:34.655839Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-05-06T20:27:34.673877Z INFO screenpipe_engine::ui_recorder: UI recording session started: 54869993-7b4b-491f-b717-2a583517f9c5\n2026-05-06T20:27:34.673910Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-05-06T20:27:34.674057Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-05-05 17:27:34.674056 UTC to 2026-05-06 17:27:34.674056 UTC)\n2026-05-06T20:27:34.674892Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-05-06T20:27:34.675788Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 0 frame entries, coverage from 2026-05-05 17:27:34.674056 UTC\n2026-05-06T20:27:34.686546Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-05-06T20:27:34.691371Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-05-06T20:27:36.270608Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-05-06T20:27:36.270669Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.270714Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.932583Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-05-06T20:27:36.932852Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-05-06T20:27:36.932882Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-05-06T20:27:36.932899Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-05-06T20:27:36.932901Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-05-06T20:27:39.158281Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 3 excluded)\n2026-05-06T20:27:39.593177Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1, dur=101ms\n2026-05-06T20:27:40.672366Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)\n2026-05-06T20:27:41.257664Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=2, dur=140ms\n2026-05-06T20:27:44.641022Z INFO screenpipe_audio::transcription::engine: whisper model available: \"/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin\"\n2026-05-06T20:27:44.641079Z INFO screenpipe_audio::transcription::whisper::model: whisper context: gpu acceleration enabled (Metal on macOS, Vulkan on Windows)\n2026-05-06T20:27:44.641086Z INFO screenpipe_audio::transcription::engine: loading whisper model with GPU acceleration...\nwhisper_init_from_file_with_params_no_state: loading model from '/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin'\nwhisper_init_with_params_no_state: use gpu = 1\nwhisper_init_with_params_no_state: flash attn = 0\nwhisper_init_with_params_no_state: gpu_device = 0\nwhisper_init_with_params_no_state: dtw = 0\nggml_metal_device_init: tensor API disabled for pre-M5 and pre-A19 devices\nggml_metal_library_init: using embedded metal library\nggml_metal_library_init: loaded in 0.041 sec\nggml_metal_rsets_init: creating a residency set collection (keep_alive = 180 s)\nggml_metal_device_init: GPU name: Apple M1\nggml_metal_device_init: GPU family: MTLGPUFamilyApple7 (1007)\nggml_metal_device_init: GPU family: MTLGPUFamilyCommon3 (3003)\nggml_metal_device_init: GPU family: MTLGPUFamilyMetal3 (5001)\nggml_metal_device_init: simdgroup reduction = true\nggml_metal_device_init: simdgroup matrix mul. = true\nggml_metal_device_init: has unified memory = true\nggml_metal_device_init: has bfloat = true\nggml_metal_device_init: has tensor = false\nggml_metal_device_init: use residency sets = true\nggml_metal_device_init: use shared buffers = true\nggml_metal_device_init: recommendedMaxWorkingSetSize = 11453.25 MB\nwhisper_init_with_params_no_state: devices = 3\nwhisper_init_with_params_no_state: backends = 3\nwhisper_model_load: loading model\nwhisper_model_load: n_vocab = 51865\nwhisper_model_load: n_audio_ctx = 1500\nwhisper_model_load: n_audio_state = 384\nwhisper_model_load: n_audio_head = 6\nwhisper_model_load: n_audio_layer = 4\nwhisper_model_load: n_text_ctx = 448\nwhisper_model_load: n_text_state = 384\nwhisper_model_load: n_text_head = 6\nwhisper_model_load: n_text_layer = 4\nwhisper_model_load: n_mels = 80\nwhisper_model_load: ftype = 1\nwhisper_model_load: qntvr = 0\nwhisper_model_load: type = 1 (tiny)\nwhisper_model_load: adding 1608 extra tokens\nwhisper_model_load: n_langs = 99\nwhisper_model_load: Metal total size = 77.11 MB\nwhisper_model_load: model size = 77.11 MB\n2026-05-06T20:27:44.857210Z INFO screenpipe_audio::transcription::engine: whisper model loaded successfully\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\n2026-05-06T20:27:44.861912Z INFO screenpipe_audio::audio_manager::manager: transcription session created (will be reused across segments)\n2026-05-06T20:27:44.862480Z INFO screenpipe_audio::audio_manager::manager: audio manager started\n2026-05-06T20:27:44.862525Z INFO screenpipe_audio::audio_manager::manager: calendar-assisted speaker diarization: listening for meeting events\n2026-05-06T20:27:47.831980Z INFO screenpipe_audio::device::device_manager: starting recording for device: System Audio (output)\n2026-05-06T20:27:47.832191Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for System Audio (output) (unknown / 30s segments)\n2026-05-06T20:27:47.906029Z INFO screenpipe_audio::device::device_manager: starting recording for device: MacBook Pro Microphone (input)\n2026-05-06T20:27:47.906090Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for MacBook Pro Microphone (input) (wired / 30s segments)\n2026-05-06T20:28:15.251258Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8608554010568040663, trigger=visual_change)\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\n2026-05-06T20:29:45.187551Z INFO screenpipe_audio::audio_manager::manager: reconciliation: transcribed 6 orphaned chunks\n2026-05-06T20:30:06.916244Z WARN screenpipe_audio::core::source_buffer: [MacBook Pro Microphone (input)] large gap on wired device: 81.4ms elapsed (expected 5.3ms) → inserting 76.0ms silence (7299 samples)\n2026-05-06T20:30:29.881247Z WARN screenpipe_audio::core::source_buffer: [MacBook Pro Microphone (input)] large gap on wired device: 96.0ms elapsed (expected 5.3ms) → inserting 90.7ms silence (8704 samples)\n^C2026-05-06T20:31:44.992913Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-05-06T20:31:44.993815Z INFO screenpipe_audio::device::device_manager: Stopping device: System Audio (output)\n2026-05-06T20:31:44.993845Z INFO screenpipe_audio::device::device_manager: Stopping device: System Audio (output)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","is_focused":true},{"role":"AXTextField","text":"you","depth":3,"bounds":{"left":0.7888889,"top":0.10555556,"width":0.13055556,"height":0.024444444},"on_screen":true,"automation_id":"_NS:65","value":"you","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.7902778,"top":0.10555556,"width":0.017361112,"height":0.024444444},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.9013889,"top":0.10555556,"width":0.015277778,"height":0.024444444},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.925,"top":0.10666667,"width":0.014583333,"height":0.023333333},"on_screen":true,"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.93958336,"top":0.10666667,"width":0.014583333,"height":0.023333333},"on_screen":true,"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.47083333,"top":0.033333335,"width":0.058333334,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-6269591095506064108
|
3182944612367924321
|
visual_change
|
accessibility
|
NULL
|
-rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 -rw-r--r-- 1 lukas staff 3298542 28 Apr 18:07 compact_monitor_2_1777388874095.mp4
-rw-r--r-- 1 lukas staff 2143027 28 Apr 18:13 compact_monitor_2_1777389196097.mp4
-rw-r--r-- 1 lukas staff 2448311 28 Apr 18:18 compact_monitor_2_1777389532297.mp4
-rw-r--r-- 1 lukas staff 2780051 28 Apr 18:24 compact_monitor_2_1777389861076.mp4
-rw-r--r-- 1 lukas staff 2715534 28 Apr 18:29 compact_monitor_2_1777390193677.mp4
-rw-r--r-- 1 lukas staff 2102173 28 Apr 18:35 compact_monitor_2_1777390515997.mp4
-rw-r--r-- 1 lukas staff 2324557 28 Apr 18:40 compact_monitor_2_1777390843577.mp4
-rw-r--r-- 1 lukas staff 1525510 28 Apr 18:46 compact_monitor_2_1777391163945.mp4
-rw-r--r-- 1 lukas staff 2776584 28 Apr 18:51 compact_monitor_2_1777391495138.mp4
-rw-r--r-- 1 lukas staff 1168205 28 Apr 18:57 compact_monitor_2_1777391825305.mp4
-rw-r--r-- 1 lukas staff 1736686 28 Apr 19:02 compact_monitor_2_1777392149583.mp4
-rw-r--r-- 1 lukas staff 2133415 28 Apr 19:07 compact_monitor_2_1777392471754.mp4
-rw-r--r-- 1 lukas staff 1289951 28 Apr 19:13 compact_monitor_2_1777392794343.mp4
-rw-r--r-- 1 lukas staff 223494 28 Apr 19:18 compact_monitor_2_1777393110228.mp4
-rw-r--r-- 1 lukas staff 222168 28 Apr 19:23 compact_monitor_2_1777393424109.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-28 $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22523176
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 28 Apr 16:51 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11525263360 28 Apr 19:33 db.sqlite
-rw-r--r-- 1 lukas staff 65536 28 Apr 15:26 db.sqlite-shm
-rw-r--r-- 1 lukas staff 2323712 28 Apr 22:23 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34227 26 Apr 17:01 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 18:58:18] ========================================
[2026-05-06 18:58:18] Screenpipe sync starting for: 2026-04-27
[2026-05-06 18:58:18] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m04s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m06s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m07s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ⠧ Runtime error near line 3: disk I/O error (10)
frames (7543 rows) ⠴ %
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-27
[2026-05-06 19:22:16] ========================================
[2026-05-06 19:22:16] Screenpipe sync starting for: 2026-04-27
[2026-05-06 19:22:16] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (7.7G)
Data dir: OK (242 files, 325M)
[+00m01s] ▶ Counting source rows for 2026-04-27
frames: 7543
elements: 470235
ui_events: 9909
ocr_text: 2193
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m03s] ▶ Syncing data for 2026-04-27
video_chunks ✓ 0m11s
frames (7543 rows) ✓ 4m40s
ocr_text (2193 rows) ✓ 0m25s
ui_events (9909 rows) ✓ 0m02s
elements (470235 rows) ✓ 2m46s
meetings (3 rows) ✓ 0m00s
[+08m07s] ▶ Updating FTS indexes
elements_fts ✓ 2m59s
frames_fts ✓ 6m07s
ui_events_fts ✓ 0m03s
[+17m16s] ▶ Verifying DB
frames: 7543 / 7543 ✓
elements: 470235 / 470235 ✓
ui_events: 9909 / 9909 ✓
ocr_text: 2193 / 2193 ✓
meetings: 3 / 3 ✓
[+18m46s] ▶ Copying data folder for 2026-04-27
rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)
[2026-05-06 19:41:28] Archive DB size: 9.7G
[2026-05-06 19:41:28] Total time: 19m12s
[2026-05-06 19:41:28] Sync complete for 2026-04-27
[2026-05-06 19:41:28] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28
[2026-05-06 19:44:49] ========================================
[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28
[2026-05-06 19:44:49] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (9.7G)
Data dir: OK (223 files, 159M)
[+00m00s] ▶ Counting source rows for 2026-04-28
frames: 4535
elements: 407532
ui_events: 8621
ocr_text: 1623
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m00s
creating FTS tables ✓ 0m00s
[+00m02s] ▶ Syncing data for 2026-04-28
video_chunks ✓ 0m12s
frames (4535 rows) ✓ 1m30s
ocr_text (1623 rows) ✓ 0m32s
ui_events (8621 rows) ✓ 0m01s
elements (407532 rows) ✓ 1m02s
meetings (3 rows) ✓ 0m00s
[+03m19s] ▶ Updating FTS indexes
elements_fts ✓ 1m36s
frames_fts ✓ 2m28s
ui_events_fts ✓ 0m04s
[+07m27s] ▶ Verifying DB
frames: 4535 / 4535 ✓
elements: 407532 / 407532 ✓
ui_events: 8621 / 8621 ✓
ocr_text: 1623 / 1623 ✓
meetings: 3 / 3 ✓
[+08m59s] ▶ Copying data folder for 2026-04-28
rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)
[2026-05-06 19:54:08] Archive DB size: 10G
[2026-05-06 19:54:08] Total time: 9m19s
[2026-05-06 19:54:08] Sync complete for 2026-04-28
[2026-05-06 19:54:08] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll
total 24
drwx------ 9 lukas staff 288 28 Apr 09:18 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
drwx------ 5 lukas staff 160 1 Nov 2021 _cacache
drwx------@ 2 lukas staff 64 28 Apr 09:18 _locks
drwx------ 15 lukas staff 480 27 Apr 19:54 _logs
drwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx
-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked
-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json
-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 52920
drwx------+ 92 lukas staff 2944 6 May 20:22 .
drwxr-xr-x 5 root admin 160 23 Aug 2024 ..
-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding
-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store
drwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash
drwx------ 5 lukas staff 160 1 Nov 2021 .aws
-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json
-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history
-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc
drwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito
drwx------@ 6 lukas staff 192 9 Apr 19:53 .cache
drwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude
-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json
drwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium
drwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer
drwx------ 16 lukas staff 512 21 May 2025 .config
drwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue
drwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot
drwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor
drwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor
drwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona
drwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb
drwx------ 24 lukas staff 768 27 Apr 18:14 .docker
drwx------ 15 lukas staff 480 6 Jun 2023 .dropbox
drwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak
-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth
-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig
-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp
drwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon
drwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc
-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst
drwx------ 5 lukas staff 160 23 Dec 2024 .local
-rw------- 1 lukas staff 204 16 Mar 2024 .netrc
drwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp
-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history
-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer
drwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py
drwx------ 8 lukas staff 256 6 May 20:24 .npm
-rw------- 1 lukas staff 74 20 May 2024 .npmrc
drwx------ 32 lukas staff 1024 25 Jul 2025 .nvm
drwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile
-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history
drwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode
drwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight
drwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint
drwx------ 15 lukas staff 480 8 Aug 2025 .ssh
drwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit
drwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm
-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
UW PICO 5.09 New Buffer
[ Read 1 line ]
^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos
^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell
drwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm
drwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf
drwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn
-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc
-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile
-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy
-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave
-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save
-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees
-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc
drwx------@ 9 lukas staff 288 20 Apr 20:55 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV
drwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads
drwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen
drwx------@ 112 lukas staff 3584 2 Dec 09:19 Library
drwx------ 7 lukas staff 224 12 Feb 2024 Movies
drwx------+ 5 lukas staff 160 25 Sep 2023 Music
drwx------+ 9 lukas staff 288 25 Sep 2023 Pictures
drwx------ 3 lukas staff 96 8 Nov 2021 Postman
drwx------+ 4 lukas staff 128 28 Oct 2021 Public
-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf
drwx------ 4 lukas staff 128 2 Jul 2023 Users
-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log
-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log
-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4
-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 2025 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast
-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin
-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh
-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
cd: no such file or directory: /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated
checking permissions...
screen recording: ok
microphone: ok
accessibility: ok
2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap
2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update
2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits
2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown
2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export
2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary
2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ false │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 7 │
│ retention mode │ media-only (keep transcripts) │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ MacBook Pro Microphone (input) │
│ │ System Audio (output) │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: https://github.com/screenpipe/screenpipe/releases
2026-05-06T20:27:34.638384Z INFO screenpipe: starting UI event capture
2026-05-06T20:27:34.637679Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-05-06T20:27:34.649154Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(94))
2026-05-06T20:27:34.652794Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh
2026-05-06T20:27:34.655839Z INFO screenpipe_engine::ui_recorder: Starting UI event capture
2026-05-06T20:27:34.673877Z INFO screenpipe_engine::ui_recorder: UI recording session started: 54869993-7b4b-491f-b717-2a583517f9c5
2026-05-06T20:27:34.673910Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)
2026-05-06T20:27:34.674057Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-05-05 17:27:34.674056 UTC to 2026-05-06 17:27:34.674056 UTC)
2026-05-06T20:27:34.674892Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)
2026-05-06T20:27:34.675788Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 0 frame entries, coverage from 2026-05-05 17:27:34.674056 UTC
2026-05-06T20:27:34.686546Z INFO screenpipe_engine::server: Server listening on [IP_ADDRESS]:3030
2026-05-06T20:27:34.691371Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030
2026-05-06T20:27:36.270608Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)
2026-05-06T20:27:36.270669Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)
2026-05-06T20:27:36.270714Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)
2026-05-06T20:27:36.932583Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)
2026-05-06T20:27:36.932852Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)
2026-05-06T20:27:36.932882Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)
2026-05-06T20:27:36.932899Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)
2026-05-06T20:27:36.932901Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)
2026-05-06T20:27:39.158281Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 3 excluded)
2026-05-06T20:27:39.593177Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1, dur=101ms
2026-05-06T20:27:40.672366Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)
2026-05-06T20:27:41.257664Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=2, dur=140ms
2026-05-06T20:27:44.641022Z INFO screenpipe_audio::transcription::engine: whisper model available: "/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin"
2026-05-06T20:27:44.641079Z INFO screenpipe_audio::transcription::whisper::model: whisper context: gpu acceleration enabled (Metal on macOS, Vulkan on Windows)
2026-05-06T20:27:44.641086Z INFO screenpipe_audio::transcription::engine: loading whisper model with GPU acceleration...
whisper_init_from_file_with_params_no_state: loading model from '/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin'
whisper_init_with_params_no_state: use gpu = 1
whisper_init_with_params_no_state: flash attn = 0
whisper_init_with_params_no_state: gpu_device = 0
whisper_init_with_params_no_state: dtw = 0
ggml_metal_device_init: tensor API disabled for pre-M5 and pre-A19 devices
ggml_metal_library_init: using embedded metal library
ggml_metal_library_init: loaded in 0.041 sec
ggml_metal_rsets_init: creating a residency set collection (keep_alive = 180 s)
ggml_metal_device_init: GPU name: Apple M1
ggml_metal_device_init: GPU family: MTLGPUFamilyApple7 (1007)
ggml_metal_device_init: GPU family: MTLGPUFamilyCommon3 (3003)
ggml_metal_device_init: GPU family: MTLGPUFamilyMetal3 (5001)
ggml_metal_device_init: simdgroup reduction = true
ggml_metal_device_init: simdgroup matrix mul. = true
ggml_metal_device_init: has unified memory = true
ggml_metal_device_init: has bfloat = true
ggml_metal_device_init: has tensor = false
ggml_metal_device_init: use residency sets = true
ggml_metal_device_init: use shared buffers = true
ggml_metal_device_init: recommendedMaxWorkingSetSize = 11453.25 MB
whisper_init_with_params_no_state: devices = 3
whisper_init_with_params_no_state: backends = 3
whisper_model_load: loading model
whisper_model_load: n_vocab = 51865
whisper_model_load: n_audio_ctx = 1500
whisper_model_load: n_audio_state = 384
whisper_model_load: n_audio_head = 6
whisper_model_load: n_audio_layer = 4
whisper_model_load: n_text_ctx = 448
whisper_model_load: n_text_state = 384
whisper_model_load: n_text_head = 6
whisper_model_load: n_text_layer = 4
whisper_model_load: n_mels = 80
whisper_model_load: ftype = 1
whisper_model_load: qntvr = 0
whisper_model_load: type = 1 (tiny)
whisper_model_load: adding 1608 extra tokens
whisper_model_load: n_langs = 99
whisper_model_load: Metal total size = 77.11 MB
whisper_model_load: model size = 77.11 MB
2026-05-06T20:27:44.857210Z INFO screenpipe_audio::transcription::engine: whisper model loaded successfully
whisper_backend_init_gpu: device 0: Metal (type: 1)
whisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)
whisper_backend_init_gpu: using Metal backend
ggml_metal_init: allocating
ggml_metal_init: found device: Apple M1
ggml_metal_init: picking default device: Apple M1
ggml_metal_init: use fusion = true
ggml_metal_init: use concurrency = true
ggml_metal_init: use graph optimize = true
whisper_backend_init: using BLAS backend
whisper_init_state: kv self size = 3.15 MB
whisper_init_state: kv cross size = 9.44 MB
whisper_init_state: kv pad size = 2.36 MB
whisper_init_state: compute buffer (conv) = 14.17 MB
whisper_init_state: compute buffer (encode) = 65.96 MB
whisper_init_state: compute buffer (cross) = 8.50 MB
whisper_init_state: compute buffer (decode) = 96.83 MB
2026-05-06T20:27:44.861912Z INFO screenpipe_audio::audio_manager::manager: transcription session created (will be reused across segments)
2026-05-06T20:27:44.862480Z INFO screenpipe_audio::audio_manager::manager: audio manager started
2026-05-06T20:27:44.862525Z INFO screenpipe_audio::audio_manager::manager: calendar-assisted speaker diarization: listening for meeting events
2026-05-06T20:27:47.831980Z INFO screenpipe_audio::device::device_manager: starting recording for device: System Audio (output)
2026-05-06T20:27:47.832191Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for System Audio (output) (unknown / 30s segments)
2026-05-06T20:27:47.906029Z INFO screenpipe_audio::device::device_manager: starting recording for device: MacBook Pro Microphone (input)
2026-05-06T20:27:47.906090Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for MacBook Pro Microphone (input) (wired / 30s segments)
2026-05-06T20:28:15.251258Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8608554010568040663, trigger=visual_change)
whisper_backend_init_gpu: device 0: Metal (type: 1)
whisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)
whisper_backend_init_gpu: using Metal backend
ggml_metal_init: allocating
ggml_metal_init: found device: Apple M1
ggml_metal_init: picking default device: Apple M1
ggml_metal_init: use fusion = true
ggml_metal_init: use concurrency = true
ggml_metal_init: use graph optimize = true
whisper_backend_init: using BLAS backend
whisper_init_state: kv self size = 3.15 MB
whisper_init_state: kv cross size = 9.44 MB
whisper_init_state: kv pad size = 2.36 MB
whisper_init_state: compute buffer (conv) = 14.17 MB
whisper_init_state: compute buffer (encode) = 65.96 MB
whisper_init_state: compute buffer (cross) = 8.50 MB
whisper_init_state: compute buffer (decode) = 96.83 MB
ggml_metal_free: deallocating
whisper_backend_init_gpu: device 0: Metal (type: 1)
whisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)
whisper_backend_init_gpu: using Metal backend
ggml_metal_init: allocating
ggml_metal_init: found device: Apple M1
ggml_metal_init: picking default device: Apple M1
ggml_metal_init: use fusion = true
ggml_metal_init: use concurrency = true
ggml_metal_init: use graph optimize = true
whisper_backend_init: using BLAS backend
whisper_init_state: kv self size = 3.15 MB
whisper_init_state: kv cross size = 9.44 MB
whisper_init_state: kv pad size = 2.36 MB
whisper_init_state: compute buffer (conv) = 14.17 MB
whisper_init_state: compute buffer (encode) = 65.96 MB
whisper_init_state: compute buffer (cross) = 8.50 MB
whisper_init_state: compute buffer (decode) = 96.83 MB
ggml_metal_free: deallocating
whisper_backend_init_gpu: device 0: Metal (type: 1)
whisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)
whisper_backend_init_gpu: using Metal backend
ggml_metal_init: allocating
ggml_metal_init: found device: Apple M1
ggml_metal_init: picking default device: Apple M1
ggml_metal_init: use fusion = true
ggml_metal_init: use concurrency = true
ggml_metal_init: use graph optimize = true
whisper_backend_init: using BLAS backend
whisper_init_state: kv self size = 3.15 MB
whisper_init_state: kv cross size = 9.44 MB
whisper_init_state: kv pad size = 2.36 MB
whisper_init_state: compute buffer (conv) = 14.17 MB
whisper_init_state: compute buffer (encode) = 65.96 MB
whisper_init_state: compute buffer (cross) = 8.50 MB
whisper_init_state: compute buffer (decode) = 96.83 ...
|
50
|
NULL
|
|
53
|
3
|
13
|
2026-05-06T17:32:25.343407+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778088745343_m1.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
rsync 2026-04-27/ → NAS ✓ 0m26s (242 f rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)
[2026-05-06 19:41:28] Archive DB size: 9.7G
[2026-05-06 19:41:28] Total time: 19m12s
[2026-05-06 19:41:28] Sync complete for 2026-04-27
[2026-05-06 19:41:28] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28
[2026-05-06 19:44:49] ========================================
[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28
[2026-05-06 19:44:49] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (9.7G)
Data dir: OK (223 files, 159M)
[+00m00s] ▶ Counting source rows for 2026-04-28
frames: 4535
elements: 407532
ui_events: 8621
ocr_text: 1623
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m00s
creating FTS tables ✓ 0m00s
[+00m02s] ▶ Syncing data for 2026-04-28
video_chunks ✓ 0m12s
frames (4535 rows) ✓ 1m30s
ocr_text (1623 rows) ✓ 0m32s
ui_events (8621 rows) ✓ 0m01s
elements (407532 rows) ✓ 1m02s
meetings (3 rows) ✓ 0m00s
[+03m19s] ▶ Updating FTS indexes
elements_fts ✓ 1m36s
frames_fts ✓ 2m28s
ui_events_fts ✓ 0m04s
[+07m27s] ▶ Verifying DB
frames: 4535 / 4535 ✓
elements: 407532 / 407532 ✓
ui_events: 8621 / 8621 ✓
ocr_text: 1623 / 1623 ✓
meetings: 3 / 3 ✓
[+08m59s] ▶ Copying data folder for 2026-04-28
rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)
[2026-05-06 19:54:08] Archive DB size: 10G
[2026-05-06 19:54:08] Total time: 9m19s
[2026-05-06 19:54:08] Sync complete for 2026-04-28
[2026-05-06 19:54:08] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll
total 24
drwx------ 9 lukas staff 288 28 Apr 09:18 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
drwx------ 5 lukas staff 160 1 Nov 2021 _cacache
drwx------@ 2 lukas staff 64 28 Apr 09:18 _locks
drwx------ 15 lukas staff 480 27 Apr 19:54 _logs
drwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx
-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked
-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json
-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 52920
drwx------+ 92 lukas staff 2944 6 May 20:22 .
drwxr-xr-x 5 root admin 160 23 Aug 2024 ..
-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding
-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store
drwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash
drwx------ 5 lukas staff 160 1 Nov 2021 .aws
-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json
-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history
-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc
drwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito
drwx------@ 6 lukas staff 192 9 Apr 19:53 .cache
drwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude
-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json
drwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium
drwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer
drwx------ 16 lukas staff 512 21 May 2025 .config
drwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue
drwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot
drwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor
drwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor
drwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona
drwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb
drwx------ 24 lukas staff 768 27 Apr 18:14 .docker
drwx------ 15 lukas staff 480 6 Jun 2023 .dropbox
drwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak
-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth
-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig
-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp
drwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon
drwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc
-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst
drwx------ 5 lukas staff 160 23 Dec 2024 .local
-rw------- 1 lukas staff 204 16 Mar 2024 .netrc
drwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp
-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history
-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer
drwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py
drwx------ 8 lukas staff 256 6 May 20:24 .npm
-rw------- 1 lukas staff 74 20 May 2024 .npmrc
drwx------ 32 lukas staff 1024 25 Jul 2025 .nvm
drwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile
-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history
drwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode
drwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight
drwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint
drwx------ 15 lukas staff 480 8 Aug 2025 .ssh
drwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit
drwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm
-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
UW PICO 5.09 New Buffer
[ Read 1 line ]
^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos
^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell
drwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm
drwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf
drwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn
-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc
-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile
-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy
-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave
-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save
-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees
-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc
drwx------@ 9 lukas staff 288 20 Apr 20:55 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV
drwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads
drwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen
drwx------@ 112 lukas staff 3584 2 Dec 09:19 Library
drwx------ 7 lukas staff 224 12 Feb 2024 Movies
drwx------+ 5 lukas staff 160 25 Sep 2023 Music
drwx------+ 9 lukas staff 288 25 Sep 2023 Pictures
drwx------ 3 lukas staff 96 8 Nov 2021 Postman
drwx------+ 4 lukas staff 128 28 Oct 2021 Public
-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf
drwx------ 4 lukas staff 128 2 Jul 2023 Users
-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log
-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log
-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4
-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 2025 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast
-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin
-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh
-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
cd: no such file or directory: /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated
checking permissions...
screen recording: ok
microphone: ok
accessibility: ok
2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap
2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update
2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits
2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown
2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export
2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary
2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ false │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 7 │
│ retention mode │ media-only (keep transcripts) │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ MacBook Pro Microphone (input) │
│ │ System Audio (output) │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~ $ 2026-05-06T20:31:45.865813Z INFO screenpipe_audio::device::device_manager: Stopping device: MacBook Pro Microphone (input)
2026-05-06T20:31:45.865820Z INFO screenpipe_audio::device::device_manager: Stopping device: MacBook Pro Microphone (input)
2026-05-06T20:31:45.892593Z INFO screenpipe_audio::audio_manager::manager: audio manager stopped
2026-05-06T20:31:45.892684Z INFO screenpipe: stopping UI event capture
2026-05-06T20:31:45.893002Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop
2026-05-06T20:31:45.893977Z INFO screenpipe: received shutdown signal for VisionManager
2026-05-06T20:31:45.894556Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager
2026-05-06T20:31:45.894516Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down
2026-05-06T20:31:45.894602Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager
2026-05-06T20:31:45.895419Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2
2026-05-06T20:31:45.895898Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1
2026-05-06T20:31:45.980559Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 54869993-7b4b-491f-b717-2a583517f9c5
2026-05-06T20:31:45.980777Z INFO screenpipe: shutdown complete
ggml_metal_free: deallocating
2026-05-06T20:31:46.374234Z ERROR screenpipe_engine::event_driven_capture: event capture failed (trigger=click, monitor=1): monitor capture failed: capture task panicked: task 770 was cancelled
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ;3B
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-05-06T20:32:21.850318Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-05-06T20:32:21.937393Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-05-06T20:32:23.002257Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-05-06T20:32:23.006683Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-05-06T20:32:23.008348Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-05-06T20:32:23.030912Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-05-06T20:32:23.030979Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-05-06T20:32:23.031261Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-05-06T20:32:23.031328Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-05-06T20:32:23.031199Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-05-06T20:32:23.031387Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-05-06T20:32:23.031253Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-05-06T20:32:23.034682Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-05-06T20:32:23.035042Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-05-06T20:32:23.035480Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-05-06T20:32:23.035607Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-05-06T20:32:23.035705Z INFO screenpipe_core::pipes: load...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)\n\n[2026-05-06 19:41:28] Archive DB size: 9.7G\n[2026-05-06 19:41:28] Total time: 19m12s\n[2026-05-06 19:41:28] Sync complete for 2026-04-27\n[2026-05-06 19:41:28] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28\n[2026-05-06 19:44:49] ========================================\n[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28\n[2026-05-06 19:44:49] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (9.7G)\n Data dir: OK (223 files, 159M)\n\n[+00m00s] ▶ Counting source rows for 2026-04-28\n frames: 4535\n elements: 407532\n ui_events: 8621\n ocr_text: 1623\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m00s\n creating FTS tables ✓ 0m00s\n\n[+00m02s] ▶ Syncing data for 2026-04-28\n video_chunks ✓ 0m12s\n frames (4535 rows) ✓ 1m30s\n ocr_text (1623 rows) ✓ 0m32s\n ui_events (8621 rows) ✓ 0m01s\n elements (407532 rows) ✓ 1m02s\n meetings (3 rows) ✓ 0m00s\n\n[+03m19s] ▶ Updating FTS indexes\n elements_fts ✓ 1m36s\n frames_fts ✓ 2m28s\n ui_events_fts ✓ 0m04s\n\n[+07m27s] ▶ Verifying DB\n frames: 4535 / 4535 ✓\n elements: 407532 / 407532 ✓\n ui_events: 8621 / 8621 ✓\n ocr_text: 1623 / 1623 ✓\n meetings: 3 / 3 ✓\n\n[+08m59s] ▶ Copying data folder for 2026-04-28\n rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)\n\n[2026-05-06 19:54:08] Archive DB size: 10G\n[2026-05-06 19:54:08] Total time: 9m19s\n[2026-05-06 19:54:08] Sync complete for 2026-04-28\n[2026-05-06 19:54:08] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll\ntotal 24\ndrwx------ 9 lukas staff 288 28 Apr 09:18 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\ndrwx------ 5 lukas staff 160 1 Nov 2021 _cacache\ndrwx------@ 2 lukas staff 64 28 Apr 09:18 _locks\ndrwx------ 15 lukas staff 480 27 Apr 19:54 _logs\ndrwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx\n-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked\n-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json\n-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll \ntotal 52920\ndrwx------+ 92 lukas staff 2944 6 May 20:22 .\ndrwxr-xr-x 5 root admin 160 23 Aug 2024 ..\n-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding\n-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store\ndrwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash\ndrwx------ 5 lukas staff 160 1 Nov 2021 .aws\n-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json\n-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history\n-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc\ndrwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito\ndrwx------@ 6 lukas staff 192 9 Apr 19:53 .cache\ndrwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude\n-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json\ndrwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium\ndrwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer\ndrwx------ 16 lukas staff 512 21 May 2025 .config\ndrwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue\ndrwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot\ndrwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor\ndrwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor\ndrwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona\ndrwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb\ndrwx------ 24 lukas staff 768 27 Apr 18:14 .docker\ndrwx------ 15 lukas staff 480 6 Jun 2023 .dropbox\ndrwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak\n-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth\n-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig\n-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp\ndrwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon\ndrwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc\n-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst\ndrwx------ 5 lukas staff 160 23 Dec 2024 .local\n-rw------- 1 lukas staff 204 16 Mar 2024 .netrc\ndrwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp\n-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history\n-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer\ndrwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py\ndrwx------ 8 lukas staff 256 6 May 20:24 .npm\n-rw------- 1 lukas staff 74 20 May 2024 .npmrc\ndrwx------ 32 lukas staff 1024 25 Jul 2025 .nvm\ndrwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile\n-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history\ndrwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode\ndrwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight\ndrwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint\ndrwx------ 15 lukas staff 480 8 Aug 2025 .ssh\ndrwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit\ndrwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm\n-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\n UW PICO 5.09 New Buffer \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n [ Read 1 line ] \n^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos \n^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell \ndrwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm\ndrwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf\ndrwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn\n-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc\n-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile\n-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy\n-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave\n-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save\n-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees\n-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc\ndrwx------@ 9 lukas staff 288 20 Apr 20:55 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV\ndrwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads\ndrwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen\ndrwx------@ 112 lukas staff 3584 2 Dec 09:19 Library\ndrwx------ 7 lukas staff 224 12 Feb 2024 Movies\ndrwx------+ 5 lukas staff 160 25 Sep 2023 Music\ndrwx------+ 9 lukas staff 288 25 Sep 2023 Pictures\ndrwx------ 3 lukas staff 96 8 Nov 2021 Postman\ndrwx------+ 4 lukas staff 128 28 Oct 2021 Public\n-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf\ndrwx------ 4 lukas staff 128 2 Jul 2023 Users\n-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log\n-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 2025 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast\n-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin\n-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh\n-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe\ncd: no such file or directory: /Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated\nchecking permissions...\n screen recording: ok\n microphone: ok\n accessibility: ok\n2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap\n2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update\n2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits\n2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown\n2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export\n2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary\n2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ false │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n│ retention mode │ media-only (keep transcripts) │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ MacBook Pro Microphone (input) │\n│ │ System Audio (output) │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-05-06T20:27:34.638384Z INFO screenpipe: starting UI event capture\n2026-05-06T20:27:34.637679Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-05-06T20:27:34.649154Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(94))\n2026-05-06T20:27:34.652794Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-05-06T20:27:34.655839Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-05-06T20:27:34.673877Z INFO screenpipe_engine::ui_recorder: UI recording session started: 54869993-7b4b-491f-b717-2a583517f9c5\n2026-05-06T20:27:34.673910Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-05-06T20:27:34.674057Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-05-05 17:27:34.674056 UTC to 2026-05-06 17:27:34.674056 UTC)\n2026-05-06T20:27:34.674892Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-05-06T20:27:34.675788Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 0 frame entries, coverage from 2026-05-05 17:27:34.674056 UTC\n2026-05-06T20:27:34.686546Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-05-06T20:27:34.691371Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-05-06T20:27:36.270608Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-05-06T20:27:36.270669Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.270714Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.932583Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-05-06T20:27:36.932852Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-05-06T20:27:36.932882Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-05-06T20:27:36.932899Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-05-06T20:27:36.932901Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-05-06T20:27:39.158281Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 3 excluded)\n2026-05-06T20:27:39.593177Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1, dur=101ms\n2026-05-06T20:27:40.672366Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)\n2026-05-06T20:27:41.257664Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=2, dur=140ms\n2026-05-06T20:27:44.641022Z INFO screenpipe_audio::transcription::engine: whisper model available: \"/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin\"\n2026-05-06T20:27:44.641079Z INFO screenpipe_audio::transcription::whisper::model: whisper context: gpu acceleration enabled (Metal on macOS, Vulkan on Windows)\n2026-05-06T20:27:44.641086Z INFO screenpipe_audio::transcription::engine: loading whisper model with GPU acceleration...\nwhisper_init_from_file_with_params_no_state: loading model from '/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin'\nwhisper_init_with_params_no_state: use gpu = 1\nwhisper_init_with_params_no_state: flash attn = 0\nwhisper_init_with_params_no_state: gpu_device = 0\nwhisper_init_with_params_no_state: dtw = 0\nggml_metal_device_init: tensor API disabled for pre-M5 and pre-A19 devices\nggml_metal_library_init: using embedded metal library\nggml_metal_library_init: loaded in 0.041 sec\nggml_metal_rsets_init: creating a residency set collection (keep_alive = 180 s)\nggml_metal_device_init: GPU name: Apple M1\nggml_metal_device_init: GPU family: MTLGPUFamilyApple7 (1007)\nggml_metal_device_init: GPU family: MTLGPUFamilyCommon3 (3003)\nggml_metal_device_init: GPU family: MTLGPUFamilyMetal3 (5001)\nggml_metal_device_init: simdgroup reduction = true\nggml_metal_device_init: simdgroup matrix mul. = true\nggml_metal_device_init: has unified memory = true\nggml_metal_device_init: has bfloat = true\nggml_metal_device_init: has tensor = false\nggml_metal_device_init: use residency sets = true\nggml_metal_device_init: use shared buffers = true\nggml_metal_device_init: recommendedMaxWorkingSetSize = 11453.25 MB\nwhisper_init_with_params_no_state: devices = 3\nwhisper_init_with_params_no_state: backends = 3\nwhisper_model_load: loading model\nwhisper_model_load: n_vocab = 51865\nwhisper_model_load: n_audio_ctx = 1500\nwhisper_model_load: n_audio_state = 384\nwhisper_model_load: n_audio_head = 6\nwhisper_model_load: n_audio_layer = 4\nwhisper_model_load: n_text_ctx = 448\nwhisper_model_load: n_text_state = 384\nwhisper_model_load: n_text_head = 6\nwhisper_model_load: n_text_layer = 4\nwhisper_model_load: n_mels = 80\nwhisper_model_load: ftype = 1\nwhisper_model_load: qntvr = 0\nwhisper_model_load: type = 1 (tiny)\nwhisper_model_load: adding 1608 extra tokens\nwhisper_model_load: n_langs = 99\nwhisper_model_load: Metal total size = 77.11 MB\nwhisper_model_load: model size = 77.11 MB\n2026-05-06T20:27:44.857210Z INFO screenpipe_audio::transcription::engine: whisper model loaded successfully\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\n2026-05-06T20:27:44.861912Z INFO screenpipe_audio::audio_manager::manager: transcription session created (will be reused across segments)\n2026-05-06T20:27:44.862480Z INFO screenpipe_audio::audio_manager::manager: audio manager started\n2026-05-06T20:27:44.862525Z INFO screenpipe_audio::audio_manager::manager: calendar-assisted speaker diarization: listening for meeting events\n2026-05-06T20:27:47.831980Z INFO screenpipe_audio::device::device_manager: starting recording for device: System Audio (output)\n2026-05-06T20:27:47.832191Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for System Audio (output) (unknown / 30s segments)\n2026-05-06T20:27:47.906029Z INFO screenpipe_audio::device::device_manager: starting recording for device: MacBook Pro Microphone (input)\n2026-05-06T20:27:47.906090Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for MacBook Pro Microphone (input) (wired / 30s segments)\n2026-05-06T20:28:15.251258Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8608554010568040663, trigger=visual_change)\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\n2026-05-06T20:29:45.187551Z INFO screenpipe_audio::audio_manager::manager: reconciliation: transcribed 6 orphaned chunks\n2026-05-06T20:30:06.916244Z WARN screenpipe_audio::core::source_buffer: [MacBook Pro Microphone (input)] large gap on wired device: 81.4ms elapsed (expected 5.3ms) → inserting 76.0ms silence (7299 samples)\n2026-05-06T20:30:29.881247Z WARN screenpipe_audio::core::source_buffer: [MacBook Pro Microphone (input)] large gap on wired device: 96.0ms elapsed (expected 5.3ms) → inserting 90.7ms silence (8704 samples)\n^C2026-05-06T20:31:44.992913Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-05-06T20:31:44.993815Z INFO screenpipe_audio::device::device_manager: Stopping device: System Audio (output)\n2026-05-06T20:31:44.993845Z INFO screenpipe_audio::device::device_manager: Stopping device: System Audio (output)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ 2026-05-06T20:31:45.865813Z INFO screenpipe_audio::device::device_manager: Stopping device: MacBook Pro Microphone (input)\n2026-05-06T20:31:45.865820Z INFO screenpipe_audio::device::device_manager: Stopping device: MacBook Pro Microphone (input)\n2026-05-06T20:31:45.892593Z INFO screenpipe_audio::audio_manager::manager: audio manager stopped\n2026-05-06T20:31:45.892684Z INFO screenpipe: stopping UI event capture\n2026-05-06T20:31:45.893002Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-05-06T20:31:45.893977Z INFO screenpipe: received shutdown signal for VisionManager\n2026-05-06T20:31:45.894556Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-05-06T20:31:45.894516Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-05-06T20:31:45.894602Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-05-06T20:31:45.895419Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-05-06T20:31:45.895898Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-05-06T20:31:45.980559Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 54869993-7b4b-491f-b717-2a583517f9c5\n2026-05-06T20:31:45.980777Z INFO screenpipe: shutdown complete\nggml_metal_free: deallocating\n2026-05-06T20:31:46.374234Z ERROR screenpipe_engine::event_driven_capture: event capture failed (trigger=click, monitor=1): monitor capture failed: capture task panicked: task 770 was cancelled\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ;3B\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-05-06T20:32:21.850318Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-05-06T20:32:21.937393Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-05-06T20:32:23.002257Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-05-06T20:32:23.006683Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-05-06T20:32:23.008348Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-05-06T20:32:23.030912Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-05-06T20:32:23.030979Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-05-06T20:32:23.031261Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-05-06T20:32:23.031328Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-05-06T20:32:23.031199Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-05-06T20:32:23.031387Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-05-06T20:32:23.031253Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-05-06T20:32:23.034682Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-05-06T20:32:23.035042Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-05-06T20:32:23.035480Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-05-06T20:32:23.035607Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-05-06T20:32:23.035705Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-05-06T20:32:23.035815Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-05-06T20:32:23.035838Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-05-06T20:32:23.037534Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n│ retention mode │ media-only (keep transcripts) │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-05-06T20:32:23.038046Z INFO screenpipe: starting UI event capture\n2026-05-06T20:32:23.058967Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-05-06T20:32:23.060289Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(95))\n2026-05-06T20:32:23.082491Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-05-06T20:32:23.103681Z INFO screenpipe_engine::ui_recorder: UI recording session started: 83716bbd-ad71-45f9-9fba-e5b2bd8a5a97\n2026-05-06T20:32:23.103826Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-05-06T20:32:23.103903Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-05-05 17:32:23.103901 UTC to 2026-05-06 17:32:23.103901 UTC)\n2026-05-06T20:32:23.107276Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-05-06T20:32:23.116788Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-05-06T20:32:23.126899Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-05-06T20:32:23.132524Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 52 frame entries, coverage from 2026-05-05 17:32:23.103901 UTC\n2026-05-06T20:32:24.842085Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-05-06T20:32:24.842155Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-05-06T20:32:24.842202Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-05-06T20:32:25.405285Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-05-06T20:32:25.405525Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-05-06T20:32:25.405604Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-05-06T20:32:25.405641Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-05-06T20:32:25.405632Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-05-06T20:32:27.627877Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 3 excluded)","depth":4,"on_screen":true,"value":"rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)\n\n[2026-05-06 19:41:28] Archive DB size: 9.7G\n[2026-05-06 19:41:28] Total time: 19m12s\n[2026-05-06 19:41:28] Sync complete for 2026-04-27\n[2026-05-06 19:41:28] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28\n[2026-05-06 19:44:49] ========================================\n[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28\n[2026-05-06 19:44:49] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (9.7G)\n Data dir: OK (223 files, 159M)\n\n[+00m00s] ▶ Counting source rows for 2026-04-28\n frames: 4535\n elements: 407532\n ui_events: 8621\n ocr_text: 1623\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m00s\n creating FTS tables ✓ 0m00s\n\n[+00m02s] ▶ Syncing data for 2026-04-28\n video_chunks ✓ 0m12s\n frames (4535 rows) ✓ 1m30s\n ocr_text (1623 rows) ✓ 0m32s\n ui_events (8621 rows) ✓ 0m01s\n elements (407532 rows) ✓ 1m02s\n meetings (3 rows) ✓ 0m00s\n\n[+03m19s] ▶ Updating FTS indexes\n elements_fts ✓ 1m36s\n frames_fts ✓ 2m28s\n ui_events_fts ✓ 0m04s\n\n[+07m27s] ▶ Verifying DB\n frames: 4535 / 4535 ✓\n elements: 407532 / 407532 ✓\n ui_events: 8621 / 8621 ✓\n ocr_text: 1623 / 1623 ✓\n meetings: 3 / 3 ✓\n\n[+08m59s] ▶ Copying data folder for 2026-04-28\n rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)\n\n[2026-05-06 19:54:08] Archive DB size: 10G\n[2026-05-06 19:54:08] Total time: 9m19s\n[2026-05-06 19:54:08] Sync complete for 2026-04-28\n[2026-05-06 19:54:08] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll\ntotal 24\ndrwx------ 9 lukas staff 288 28 Apr 09:18 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\ndrwx------ 5 lukas staff 160 1 Nov 2021 _cacache\ndrwx------@ 2 lukas staff 64 28 Apr 09:18 _locks\ndrwx------ 15 lukas staff 480 27 Apr 19:54 _logs\ndrwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx\n-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked\n-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json\n-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll \ntotal 52920\ndrwx------+ 92 lukas staff 2944 6 May 20:22 .\ndrwxr-xr-x 5 root admin 160 23 Aug 2024 ..\n-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding\n-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store\ndrwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash\ndrwx------ 5 lukas staff 160 1 Nov 2021 .aws\n-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json\n-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history\n-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc\ndrwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito\ndrwx------@ 6 lukas staff 192 9 Apr 19:53 .cache\ndrwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude\n-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json\ndrwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium\ndrwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer\ndrwx------ 16 lukas staff 512 21 May 2025 .config\ndrwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue\ndrwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot\ndrwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor\ndrwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor\ndrwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona\ndrwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb\ndrwx------ 24 lukas staff 768 27 Apr 18:14 .docker\ndrwx------ 15 lukas staff 480 6 Jun 2023 .dropbox\ndrwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak\n-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth\n-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig\n-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp\ndrwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon\ndrwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc\n-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst\ndrwx------ 5 lukas staff 160 23 Dec 2024 .local\n-rw------- 1 lukas staff 204 16 Mar 2024 .netrc\ndrwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp\n-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history\n-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer\ndrwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py\ndrwx------ 8 lukas staff 256 6 May 20:24 .npm\n-rw------- 1 lukas staff 74 20 May 2024 .npmrc\ndrwx------ 32 lukas staff 1024 25 Jul 2025 .nvm\ndrwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile\n-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history\ndrwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode\ndrwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight\ndrwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint\ndrwx------ 15 lukas staff 480 8 Aug 2025 .ssh\ndrwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit\ndrwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm\n-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\n UW PICO 5.09 New Buffer \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n [ Read 1 line ] \n^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos \n^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell \ndrwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm\ndrwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf\ndrwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn\n-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc\n-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile\n-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy\n-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave\n-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save\n-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees\n-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc\ndrwx------@ 9 lukas staff 288 20 Apr 20:55 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV\ndrwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads\ndrwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen\ndrwx------@ 112 lukas staff 3584 2 Dec 09:19 Library\ndrwx------ 7 lukas staff 224 12 Feb 2024 Movies\ndrwx------+ 5 lukas staff 160 25 Sep 2023 Music\ndrwx------+ 9 lukas staff 288 25 Sep 2023 Pictures\ndrwx------ 3 lukas staff 96 8 Nov 2021 Postman\ndrwx------+ 4 lukas staff 128 28 Oct 2021 Public\n-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf\ndrwx------ 4 lukas staff 128 2 Jul 2023 Users\n-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log\n-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 2025 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast\n-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin\n-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh\n-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe\ncd: no such file or directory: /Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated\nchecking permissions...\n screen recording: ok\n microphone: ok\n accessibility: ok\n2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap\n2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update\n2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits\n2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown\n2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export\n2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary\n2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ false │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n│ retention mode │ media-only (keep transcripts) │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ MacBook Pro Microphone (input) │\n│ │ System Audio (output) │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-05-06T20:27:34.638384Z INFO screenpipe: starting UI event capture\n2026-05-06T20:27:34.637679Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-05-06T20:27:34.649154Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(94))\n2026-05-06T20:27:34.652794Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-05-06T20:27:34.655839Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-05-06T20:27:34.673877Z INFO screenpipe_engine::ui_recorder: UI recording session started: 54869993-7b4b-491f-b717-2a583517f9c5\n2026-05-06T20:27:34.673910Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-05-06T20:27:34.674057Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-05-05 17:27:34.674056 UTC to 2026-05-06 17:27:34.674056 UTC)\n2026-05-06T20:27:34.674892Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-05-06T20:27:34.675788Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 0 frame entries, coverage from 2026-05-05 17:27:34.674056 UTC\n2026-05-06T20:27:34.686546Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-05-06T20:27:34.691371Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-05-06T20:27:36.270608Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-05-06T20:27:36.270669Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.270714Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.932583Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-05-06T20:27:36.932852Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-05-06T20:27:36.932882Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-05-06T20:27:36.932899Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-05-06T20:27:36.932901Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-05-06T20:27:39.158281Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 3 excluded)\n2026-05-06T20:27:39.593177Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1, dur=101ms\n2026-05-06T20:27:40.672366Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)\n2026-05-06T20:27:41.257664Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=2, dur=140ms\n2026-05-06T20:27:44.641022Z INFO screenpipe_audio::transcription::engine: whisper model available: \"/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin\"\n2026-05-06T20:27:44.641079Z INFO screenpipe_audio::transcription::whisper::model: whisper context: gpu acceleration enabled (Metal on macOS, Vulkan on Windows)\n2026-05-06T20:27:44.641086Z INFO screenpipe_audio::transcription::engine: loading whisper model with GPU acceleration...\nwhisper_init_from_file_with_params_no_state: loading model from '/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin'\nwhisper_init_with_params_no_state: use gpu = 1\nwhisper_init_with_params_no_state: flash attn = 0\nwhisper_init_with_params_no_state: gpu_device = 0\nwhisper_init_with_params_no_state: dtw = 0\nggml_metal_device_init: tensor API disabled for pre-M5 and pre-A19 devices\nggml_metal_library_init: using embedded metal library\nggml_metal_library_init: loaded in 0.041 sec\nggml_metal_rsets_init: creating a residency set collection (keep_alive = 180 s)\nggml_metal_device_init: GPU name: Apple M1\nggml_metal_device_init: GPU family: MTLGPUFamilyApple7 (1007)\nggml_metal_device_init: GPU family: MTLGPUFamilyCommon3 (3003)\nggml_metal_device_init: GPU family: MTLGPUFamilyMetal3 (5001)\nggml_metal_device_init: simdgroup reduction = true\nggml_metal_device_init: simdgroup matrix mul. = true\nggml_metal_device_init: has unified memory = true\nggml_metal_device_init: has bfloat = true\nggml_metal_device_init: has tensor = false\nggml_metal_device_init: use residency sets = true\nggml_metal_device_init: use shared buffers = true\nggml_metal_device_init: recommendedMaxWorkingSetSize = 11453.25 MB\nwhisper_init_with_params_no_state: devices = 3\nwhisper_init_with_params_no_state: backends = 3\nwhisper_model_load: loading model\nwhisper_model_load: n_vocab = 51865\nwhisper_model_load: n_audio_ctx = 1500\nwhisper_model_load: n_audio_state = 384\nwhisper_model_load: n_audio_head = 6\nwhisper_model_load: n_audio_layer = 4\nwhisper_model_load: n_text_ctx = 448\nwhisper_model_load: n_text_state = 384\nwhisper_model_load: n_text_head = 6\nwhisper_model_load: n_text_layer = 4\nwhisper_model_load: n_mels = 80\nwhisper_model_load: ftype = 1\nwhisper_model_load: qntvr = 0\nwhisper_model_load: type = 1 (tiny)\nwhisper_model_load: adding 1608 extra tokens\nwhisper_model_load: n_langs = 99\nwhisper_model_load: Metal total size = 77.11 MB\nwhisper_model_load: model size = 77.11 MB\n2026-05-06T20:27:44.857210Z INFO screenpipe_audio::transcription::engine: whisper model loaded successfully\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\n2026-05-06T20:27:44.861912Z INFO screenpipe_audio::audio_manager::manager: transcription session created (will be reused across segments)\n2026-05-06T20:27:44.862480Z INFO screenpipe_audio::audio_manager::manager: audio manager started\n2026-05-06T20:27:44.862525Z INFO screenpipe_audio::audio_manager::manager: calendar-assisted speaker diarization: listening for meeting events\n2026-05-06T20:27:47.831980Z INFO screenpipe_audio::device::device_manager: starting recording for device: System Audio (output)\n2026-05-06T20:27:47.832191Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for System Audio (output) (unknown / 30s segments)\n2026-05-06T20:27:47.906029Z INFO screenpipe_audio::device::device_manager: starting recording for device: MacBook Pro Microphone (input)\n2026-05-06T20:27:47.906090Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for MacBook Pro Microphone (input) (wired / 30s segments)\n2026-05-06T20:28:15.251258Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8608554010568040663, trigger=visual_change)\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\n2026-05-06T20:29:45.187551Z INFO screenpipe_audio::audio_manager::manager: reconciliation: transcribed 6 orphaned chunks\n2026-05-06T20:30:06.916244Z WARN screenpipe_audio::core::source_buffer: [MacBook Pro Microphone (input)] large gap on wired device: 81.4ms elapsed (expected 5.3ms) → inserting 76.0ms silence (7299 samples)\n2026-05-06T20:30:29.881247Z WARN screenpipe_audio::core::source_buffer: [MacBook Pro Microphone (input)] large gap on wired device: 96.0ms elapsed (expected 5.3ms) → inserting 90.7ms silence (8704 samples)\n^C2026-05-06T20:31:44.992913Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-05-06T20:31:44.993815Z INFO screenpipe_audio::device::device_manager: Stopping device: System Audio (output)\n2026-05-06T20:31:44.993845Z INFO screenpipe_audio::device::device_manager: Stopping device: System Audio (output)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ 2026-05-06T20:31:45.865813Z INFO screenpipe_audio::device::device_manager: Stopping device: MacBook Pro Microphone (input)\n2026-05-06T20:31:45.865820Z INFO screenpipe_audio::device::device_manager: Stopping device: MacBook Pro Microphone (input)\n2026-05-06T20:31:45.892593Z INFO screenpipe_audio::audio_manager::manager: audio manager stopped\n2026-05-06T20:31:45.892684Z INFO screenpipe: stopping UI event capture\n2026-05-06T20:31:45.893002Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-05-06T20:31:45.893977Z INFO screenpipe: received shutdown signal for VisionManager\n2026-05-06T20:31:45.894556Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-05-06T20:31:45.894516Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-05-06T20:31:45.894602Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-05-06T20:31:45.895419Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-05-06T20:31:45.895898Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-05-06T20:31:45.980559Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 54869993-7b4b-491f-b717-2a583517f9c5\n2026-05-06T20:31:45.980777Z INFO screenpipe: shutdown complete\nggml_metal_free: deallocating\n2026-05-06T20:31:46.374234Z ERROR screenpipe_engine::event_driven_capture: event capture failed (trigger=click, monitor=1): monitor capture failed: capture task panicked: task 770 was cancelled\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ;3B\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-05-06T20:32:21.850318Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-05-06T20:32:21.937393Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-05-06T20:32:23.002257Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-05-06T20:32:23.006683Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-05-06T20:32:23.008348Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-05-06T20:32:23.030912Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-05-06T20:32:23.030979Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-05-06T20:32:23.031261Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-05-06T20:32:23.031328Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-05-06T20:32:23.031199Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-05-06T20:32:23.031387Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-05-06T20:32:23.031253Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-05-06T20:32:23.034682Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-05-06T20:32:23.035042Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-05-06T20:32:23.035480Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-05-06T20:32:23.035607Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-05-06T20:32:23.035705Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-05-06T20:32:23.035815Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-05-06T20:32:23.035838Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-05-06T20:32:23.037534Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n│ retention mode │ media-only (keep transcripts) │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-05-06T20:32:23.038046Z INFO screenpipe: starting UI event capture\n2026-05-06T20:32:23.058967Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-05-06T20:32:23.060289Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(95))\n2026-05-06T20:32:23.082491Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-05-06T20:32:23.103681Z INFO screenpipe_engine::ui_recorder: UI recording session started: 83716bbd-ad71-45f9-9fba-e5b2bd8a5a97\n2026-05-06T20:32:23.103826Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-05-06T20:32:23.103903Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-05-05 17:32:23.103901 UTC to 2026-05-06 17:32:23.103901 UTC)\n2026-05-06T20:32:23.107276Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-05-06T20:32:23.116788Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-05-06T20:32:23.126899Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-05-06T20:32:23.132524Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 52 frame entries, coverage from 2026-05-05 17:32:23.103901 UTC\n2026-05-06T20:32:24.842085Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-05-06T20:32:24.842155Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-05-06T20:32:24.842202Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-05-06T20:32:25.405285Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-05-06T20:32:25.405525Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-05-06T20:32:25.405604Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-05-06T20:32:25.405641Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-05-06T20:32:25.405632Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-05-06T20:32:27.627877Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 3 excluded)","is_focused":true},{"role":"AXTextField","text":"you","depth":3,"bounds":{"left":0.7888889,"top":0.10555556,"width":0.13055556,"height":0.024444444},"on_screen":true,"automation_id":"_NS:65","value":"you","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.7902778,"top":0.10555556,"width":0.017361112,"height":0.024444444},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.9013889,"top":0.10555556,"width":0.015277778,"height":0.024444444},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.925,"top":0.10666667,"width":0.014583333,"height":0.023333333},"on_screen":true,"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.93958336,"top":0.10666667,"width":0.014583333,"height":0.023333333},"on_screen":true,"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.47083333,"top":0.033333335,"width":0.058333334,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-2607752369936877213
|
4336429616147131745
|
manual
|
accessibility
|
NULL
|
rsync 2026-04-27/ → NAS ✓ 0m26s (242 f rsync 2026-04-27/ → NAS ✓ 0m26s (242 files, 325M)
[2026-05-06 19:41:28] Archive DB size: 9.7G
[2026-05-06 19:41:28] Total time: 19m12s
[2026-05-06 19:41:28] Sync complete for 2026-04-27
[2026-05-06 19:41:28] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28
[2026-05-06 19:44:49] ========================================
[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28
[2026-05-06 19:44:49] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (9.7G)
Data dir: OK (223 files, 159M)
[+00m00s] ▶ Counting source rows for 2026-04-28
frames: 4535
elements: 407532
ui_events: 8621
ocr_text: 1623
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m00s
creating FTS tables ✓ 0m00s
[+00m02s] ▶ Syncing data for 2026-04-28
video_chunks ✓ 0m12s
frames (4535 rows) ✓ 1m30s
ocr_text (1623 rows) ✓ 0m32s
ui_events (8621 rows) ✓ 0m01s
elements (407532 rows) ✓ 1m02s
meetings (3 rows) ✓ 0m00s
[+03m19s] ▶ Updating FTS indexes
elements_fts ✓ 1m36s
frames_fts ✓ 2m28s
ui_events_fts ✓ 0m04s
[+07m27s] ▶ Verifying DB
frames: 4535 / 4535 ✓
elements: 407532 / 407532 ✓
ui_events: 8621 / 8621 ✓
ocr_text: 1623 / 1623 ✓
meetings: 3 / 3 ✓
[+08m59s] ▶ Copying data folder for 2026-04-28
rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)
[2026-05-06 19:54:08] Archive DB size: 10G
[2026-05-06 19:54:08] Total time: 9m19s
[2026-05-06 19:54:08] Sync complete for 2026-04-28
[2026-05-06 19:54:08] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll
total 24
drwx------ 9 lukas staff 288 28 Apr 09:18 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
drwx------ 5 lukas staff 160 1 Nov 2021 _cacache
drwx------@ 2 lukas staff 64 28 Apr 09:18 _locks
drwx------ 15 lukas staff 480 27 Apr 19:54 _logs
drwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx
-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked
-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json
-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 52920
drwx------+ 92 lukas staff 2944 6 May 20:22 .
drwxr-xr-x 5 root admin 160 23 Aug 2024 ..
-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding
-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store
drwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash
drwx------ 5 lukas staff 160 1 Nov 2021 .aws
-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json
-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history
-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc
drwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito
drwx------@ 6 lukas staff 192 9 Apr 19:53 .cache
drwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude
-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json
drwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium
drwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer
drwx------ 16 lukas staff 512 21 May 2025 .config
drwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue
drwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot
drwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor
drwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor
drwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona
drwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb
drwx------ 24 lukas staff 768 27 Apr 18:14 .docker
drwx------ 15 lukas staff 480 6 Jun 2023 .dropbox
drwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak
-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth
-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig
-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp
drwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon
drwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc
-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst
drwx------ 5 lukas staff 160 23 Dec 2024 .local
-rw------- 1 lukas staff 204 16 Mar 2024 .netrc
drwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp
-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history
-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer
drwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py
drwx------ 8 lukas staff 256 6 May 20:24 .npm
-rw------- 1 lukas staff 74 20 May 2024 .npmrc
drwx------ 32 lukas staff 1024 25 Jul 2025 .nvm
drwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile
-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history
drwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode
drwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight
drwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint
drwx------ 15 lukas staff 480 8 Aug 2025 .ssh
drwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit
drwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm
-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
UW PICO 5.09 New Buffer
[ Read 1 line ]
^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos
^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell
drwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm
drwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf
drwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn
-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc
-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile
-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy
-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave
-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save
-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees
-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc
drwx------@ 9 lukas staff 288 20 Apr 20:55 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV
drwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads
drwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen
drwx------@ 112 lukas staff 3584 2 Dec 09:19 Library
drwx------ 7 lukas staff 224 12 Feb 2024 Movies
drwx------+ 5 lukas staff 160 25 Sep 2023 Music
drwx------+ 9 lukas staff 288 25 Sep 2023 Pictures
drwx------ 3 lukas staff 96 8 Nov 2021 Postman
drwx------+ 4 lukas staff 128 28 Oct 2021 Public
-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf
drwx------ 4 lukas staff 128 2 Jul 2023 Users
-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log
-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log
-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4
-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 2025 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast
-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin
-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh
-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
cd: no such file or directory: /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated
checking permissions...
screen recording: ok
microphone: ok
accessibility: ok
2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap
2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update
2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits
2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown
2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export
2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary
2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ false │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 7 │
│ retention mode │ media-only (keep transcripts) │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ MacBook Pro Microphone (input) │
│ │ System Audio (output) │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~ $ 2026-05-06T20:31:45.865813Z INFO screenpipe_audio::device::device_manager: Stopping device: MacBook Pro Microphone (input)
2026-05-06T20:31:45.865820Z INFO screenpipe_audio::device::device_manager: Stopping device: MacBook Pro Microphone (input)
2026-05-06T20:31:45.892593Z INFO screenpipe_audio::audio_manager::manager: audio manager stopped
2026-05-06T20:31:45.892684Z INFO screenpipe: stopping UI event capture
2026-05-06T20:31:45.893002Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop
2026-05-06T20:31:45.893977Z INFO screenpipe: received shutdown signal for VisionManager
2026-05-06T20:31:45.894556Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager
2026-05-06T20:31:45.894516Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down
2026-05-06T20:31:45.894602Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager
2026-05-06T20:31:45.895419Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2
2026-05-06T20:31:45.895898Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1
2026-05-06T20:31:45.980559Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 54869993-7b4b-491f-b717-2a583517f9c5
2026-05-06T20:31:45.980777Z INFO screenpipe: shutdown complete
ggml_metal_free: deallocating
2026-05-06T20:31:46.374234Z ERROR screenpipe_engine::event_driven_capture: event capture failed (trigger=click, monitor=1): monitor capture failed: capture task panicked: task 770 was cancelled
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ;3B
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-05-06T20:32:21.850318Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-05-06T20:32:21.937393Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-05-06T20:32:23.002257Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-05-06T20:32:23.006683Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-05-06T20:32:23.008348Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-05-06T20:32:23.030912Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-05-06T20:32:23.030979Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-05-06T20:32:23.031261Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-05-06T20:32:23.031328Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-05-06T20:32:23.031199Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-05-06T20:32:23.031387Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-05-06T20:32:23.031253Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-05-06T20:32:23.034682Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-05-06T20:32:23.035042Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-05-06T20:32:23.035480Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-05-06T20:32:23.035607Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-05-06T20:32:23.035705Z INFO screenpipe_core::pipes: load...
|
NULL
|
NULL
|
|
54
|
4
|
14
|
2026-05-06T17:32:25.907869+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778088745907_m2.jpg...
|
iTerm2
|
screenpipe"
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
[2026-05-06 19:41:28] Archive DB size: 9.7G
[2026 [2026-05-06 19:41:28] Archive DB size: 9.7G
[2026-05-06 19:41:28] Total time: 19m12s
[2026-05-06 19:41:28] Sync complete for 2026-04-27
[2026-05-06 19:41:28] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28
[2026-05-06 19:44:49] ========================================
[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28
[2026-05-06 19:44:49] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (9.7G)
Data dir: OK (223 files, 159M)
[+00m00s] ▶ Counting source rows for 2026-04-28
frames: 4535
elements: 407532
ui_events: 8621
ocr_text: 1623
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m00s
creating FTS tables ✓ 0m00s
[+00m02s] ▶ Syncing data for 2026-04-28
video_chunks ✓ 0m12s
frames (4535 rows) ✓ 1m30s
ocr_text (1623 rows) ✓ 0m32s
ui_events (8621 rows) ✓ 0m01s
elements (407532 rows) ✓ 1m02s
meetings (3 rows) ✓ 0m00s
[+03m19s] ▶ Updating FTS indexes
elements_fts ✓ 1m36s
frames_fts ✓ 2m28s
ui_events_fts ✓ 0m04s
[+07m27s] ▶ Verifying DB
frames: 4535 / 4535 ✓
elements: 407532 / 407532 ✓
ui_events: 8621 / 8621 ✓
ocr_text: 1623 / 1623 ✓
meetings: 3 / 3 ✓
[+08m59s] ▶ Copying data folder for 2026-04-28
rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)
[2026-05-06 19:54:08] Archive DB size: 10G
[2026-05-06 19:54:08] Total time: 9m19s
[2026-05-06 19:54:08] Sync complete for 2026-04-28
[2026-05-06 19:54:08] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll
total 24
drwx------ 9 lukas staff 288 28 Apr 09:18 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
drwx------ 5 lukas staff 160 1 Nov 2021 _cacache
drwx------@ 2 lukas staff 64 28 Apr 09:18 _locks
drwx------ 15 lukas staff 480 27 Apr 19:54 _logs
drwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx
-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked
-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json
-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 52920
drwx------+ 92 lukas staff 2944 6 May 20:22 .
drwxr-xr-x 5 root admin 160 23 Aug 2024 ..
-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding
-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store
drwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash
drwx------ 5 lukas staff 160 1 Nov 2021 .aws
-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json
-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history
-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc
drwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito
drwx------@ 6 lukas staff 192 9 Apr 19:53 .cache
drwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude
-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json
drwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium
drwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer
drwx------ 16 lukas staff 512 21 May 2025 .config
drwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue
drwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot
drwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor
drwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor
drwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona
drwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb
drwx------ 24 lukas staff 768 27 Apr 18:14 .docker
drwx------ 15 lukas staff 480 6 Jun 2023 .dropbox
drwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak
-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth
-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig
-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp
drwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon
drwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc
-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst
drwx------ 5 lukas staff 160 23 Dec 2024 .local
-rw------- 1 lukas staff 204 16 Mar 2024 .netrc
drwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp
-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history
-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer
drwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py
drwx------ 8 lukas staff 256 6 May 20:24 .npm
-rw------- 1 lukas staff 74 20 May 2024 .npmrc
drwx------ 32 lukas staff 1024 25 Jul 2025 .nvm
drwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile
-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history
drwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode
drwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight
drwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint
drwx------ 15 lukas staff 480 8 Aug 2025 .ssh
drwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit
drwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm
-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
UW PICO 5.09 New Buffer
[ Read 1 line ]
^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos
^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell
drwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm
drwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf
drwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn
-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc
-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile
-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy
-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave
-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save
-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees
-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc
drwx------@ 9 lukas staff 288 20 Apr 20:55 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV
drwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads
drwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen
drwx------@ 112 lukas staff 3584 2 Dec 09:19 Library
drwx------ 7 lukas staff 224 12 Feb 2024 Movies
drwx------+ 5 lukas staff 160 25 Sep 2023 Music
drwx------+ 9 lukas staff 288 25 Sep 2023 Pictures
drwx------ 3 lukas staff 96 8 Nov 2021 Postman
drwx------+ 4 lukas staff 128 28 Oct 2021 Public
-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf
drwx------ 4 lukas staff 128 2 Jul 2023 Users
-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log
-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log
-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4
-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 2025 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast
-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin
-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh
-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
cd: no such file or directory: /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated
checking permissions...
screen recording: ok
microphone: ok
accessibility: ok
2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap
2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update
2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits
2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown
2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export
2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary
2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ false │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 7 │
│ retention mode │ media-only (keep transcripts) │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ MacBook Pro Microphone (input) │
│ │ System Audio (output) │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~ $ 2026-05-06T20:31:45.865813Z INFO screenpipe_audio::device::device_manager: Stopping device: MacBook Pro Microphone (input)
2026-05-06T20:31:45.865820Z INFO screenpipe_audio::device::device_manager: Stopping device: MacBook Pro Microphone (input)
2026-05-06T20:31:45.892593Z INFO screenpipe_audio::audio_manager::manager: audio manager stopped
2026-05-06T20:31:45.892684Z INFO screenpipe: stopping UI event capture
2026-05-06T20:31:45.893002Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop
2026-05-06T20:31:45.893977Z INFO screenpipe: received shutdown signal for VisionManager
2026-05-06T20:31:45.894556Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager
2026-05-06T20:31:45.894516Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down
2026-05-06T20:31:45.894602Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager
2026-05-06T20:31:45.895419Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2
2026-05-06T20:31:45.895898Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1
2026-05-06T20:31:45.980559Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 54869993-7b4b-491f-b717-2a583517f9c5
2026-05-06T20:31:45.980777Z INFO screenpipe: shutdown complete
ggml_metal_free: deallocating
2026-05-06T20:31:46.374234Z ERROR screenpipe_engine::event_driven_capture: event capture failed (trigger=click, monitor=1): monitor capture failed: capture task panicked: task 770 was cancelled
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ;3B
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-05-06T20:32:21.850318Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-05-06T20:32:21.937393Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-05-06T20:32:23.002257Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-05-06T20:32:23.006683Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-05-06T20:32:23.008348Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-05-06T20:32:23.030912Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-05-06T20:32:23.030979Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-05-06T20:32:23.031261Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-05-06T20:32:23.031328Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-05-06T20:32:23.031199Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-05-06T20:32:23.031387Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-05-06T20:32:23.031253Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-05-06T20:32:23.034682Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-05-06T20:32:23.035042Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-05-06T20:32:23.035480Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-05-06T20:32:23.035607Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-05-06T20:32:23.035705Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-05-06T20:32:23.035815Z INFO screenpipe_...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"[2026-05-06 19:41:28] Archive DB size: 9.7G\n[2026-05-06 19:41:28] Total time: 19m12s\n[2026-05-06 19:41:28] Sync complete for 2026-04-27\n[2026-05-06 19:41:28] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28\n[2026-05-06 19:44:49] ========================================\n[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28\n[2026-05-06 19:44:49] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (9.7G)\n Data dir: OK (223 files, 159M)\n\n[+00m00s] ▶ Counting source rows for 2026-04-28\n frames: 4535\n elements: 407532\n ui_events: 8621\n ocr_text: 1623\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m00s\n creating FTS tables ✓ 0m00s\n\n[+00m02s] ▶ Syncing data for 2026-04-28\n video_chunks ✓ 0m12s\n frames (4535 rows) ✓ 1m30s\n ocr_text (1623 rows) ✓ 0m32s\n ui_events (8621 rows) ✓ 0m01s\n elements (407532 rows) ✓ 1m02s\n meetings (3 rows) ✓ 0m00s\n\n[+03m19s] ▶ Updating FTS indexes\n elements_fts ✓ 1m36s\n frames_fts ✓ 2m28s\n ui_events_fts ✓ 0m04s\n\n[+07m27s] ▶ Verifying DB\n frames: 4535 / 4535 ✓\n elements: 407532 / 407532 ✓\n ui_events: 8621 / 8621 ✓\n ocr_text: 1623 / 1623 ✓\n meetings: 3 / 3 ✓\n\n[+08m59s] ▶ Copying data folder for 2026-04-28\n rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)\n\n[2026-05-06 19:54:08] Archive DB size: 10G\n[2026-05-06 19:54:08] Total time: 9m19s\n[2026-05-06 19:54:08] Sync complete for 2026-04-28\n[2026-05-06 19:54:08] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll\ntotal 24\ndrwx------ 9 lukas staff 288 28 Apr 09:18 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\ndrwx------ 5 lukas staff 160 1 Nov 2021 _cacache\ndrwx------@ 2 lukas staff 64 28 Apr 09:18 _locks\ndrwx------ 15 lukas staff 480 27 Apr 19:54 _logs\ndrwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx\n-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked\n-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json\n-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll \ntotal 52920\ndrwx------+ 92 lukas staff 2944 6 May 20:22 .\ndrwxr-xr-x 5 root admin 160 23 Aug 2024 ..\n-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding\n-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store\ndrwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash\ndrwx------ 5 lukas staff 160 1 Nov 2021 .aws\n-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json\n-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history\n-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc\ndrwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito\ndrwx------@ 6 lukas staff 192 9 Apr 19:53 .cache\ndrwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude\n-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json\ndrwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium\ndrwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer\ndrwx------ 16 lukas staff 512 21 May 2025 .config\ndrwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue\ndrwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot\ndrwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor\ndrwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor\ndrwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona\ndrwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb\ndrwx------ 24 lukas staff 768 27 Apr 18:14 .docker\ndrwx------ 15 lukas staff 480 6 Jun 2023 .dropbox\ndrwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak\n-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth\n-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig\n-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp\ndrwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon\ndrwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc\n-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst\ndrwx------ 5 lukas staff 160 23 Dec 2024 .local\n-rw------- 1 lukas staff 204 16 Mar 2024 .netrc\ndrwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp\n-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history\n-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer\ndrwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py\ndrwx------ 8 lukas staff 256 6 May 20:24 .npm\n-rw------- 1 lukas staff 74 20 May 2024 .npmrc\ndrwx------ 32 lukas staff 1024 25 Jul 2025 .nvm\ndrwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile\n-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history\ndrwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode\ndrwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight\ndrwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint\ndrwx------ 15 lukas staff 480 8 Aug 2025 .ssh\ndrwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit\ndrwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm\n-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\n UW PICO 5.09 New Buffer \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n [ Read 1 line ] \n^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos \n^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell \ndrwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm\ndrwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf\ndrwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn\n-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc\n-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile\n-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy\n-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave\n-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save\n-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees\n-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc\ndrwx------@ 9 lukas staff 288 20 Apr 20:55 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV\ndrwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads\ndrwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen\ndrwx------@ 112 lukas staff 3584 2 Dec 09:19 Library\ndrwx------ 7 lukas staff 224 12 Feb 2024 Movies\ndrwx------+ 5 lukas staff 160 25 Sep 2023 Music\ndrwx------+ 9 lukas staff 288 25 Sep 2023 Pictures\ndrwx------ 3 lukas staff 96 8 Nov 2021 Postman\ndrwx------+ 4 lukas staff 128 28 Oct 2021 Public\n-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf\ndrwx------ 4 lukas staff 128 2 Jul 2023 Users\n-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log\n-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 2025 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast\n-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin\n-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh\n-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe\ncd: no such file or directory: /Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated\nchecking permissions...\n screen recording: ok\n microphone: ok\n accessibility: ok\n2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap\n2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update\n2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits\n2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown\n2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export\n2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary\n2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ false │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n│ retention mode │ media-only (keep transcripts) │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ MacBook Pro Microphone (input) │\n│ │ System Audio (output) │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-05-06T20:27:34.638384Z INFO screenpipe: starting UI event capture\n2026-05-06T20:27:34.637679Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-05-06T20:27:34.649154Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(94))\n2026-05-06T20:27:34.652794Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-05-06T20:27:34.655839Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-05-06T20:27:34.673877Z INFO screenpipe_engine::ui_recorder: UI recording session started: 54869993-7b4b-491f-b717-2a583517f9c5\n2026-05-06T20:27:34.673910Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-05-06T20:27:34.674057Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-05-05 17:27:34.674056 UTC to 2026-05-06 17:27:34.674056 UTC)\n2026-05-06T20:27:34.674892Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-05-06T20:27:34.675788Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 0 frame entries, coverage from 2026-05-05 17:27:34.674056 UTC\n2026-05-06T20:27:34.686546Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-05-06T20:27:34.691371Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-05-06T20:27:36.270608Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-05-06T20:27:36.270669Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.270714Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.932583Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-05-06T20:27:36.932852Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-05-06T20:27:36.932882Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-05-06T20:27:36.932899Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-05-06T20:27:36.932901Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-05-06T20:27:39.158281Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 3 excluded)\n2026-05-06T20:27:39.593177Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1, dur=101ms\n2026-05-06T20:27:40.672366Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)\n2026-05-06T20:27:41.257664Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=2, dur=140ms\n2026-05-06T20:27:44.641022Z INFO screenpipe_audio::transcription::engine: whisper model available: \"/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin\"\n2026-05-06T20:27:44.641079Z INFO screenpipe_audio::transcription::whisper::model: whisper context: gpu acceleration enabled (Metal on macOS, Vulkan on Windows)\n2026-05-06T20:27:44.641086Z INFO screenpipe_audio::transcription::engine: loading whisper model with GPU acceleration...\nwhisper_init_from_file_with_params_no_state: loading model from '/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin'\nwhisper_init_with_params_no_state: use gpu = 1\nwhisper_init_with_params_no_state: flash attn = 0\nwhisper_init_with_params_no_state: gpu_device = 0\nwhisper_init_with_params_no_state: dtw = 0\nggml_metal_device_init: tensor API disabled for pre-M5 and pre-A19 devices\nggml_metal_library_init: using embedded metal library\nggml_metal_library_init: loaded in 0.041 sec\nggml_metal_rsets_init: creating a residency set collection (keep_alive = 180 s)\nggml_metal_device_init: GPU name: Apple M1\nggml_metal_device_init: GPU family: MTLGPUFamilyApple7 (1007)\nggml_metal_device_init: GPU family: MTLGPUFamilyCommon3 (3003)\nggml_metal_device_init: GPU family: MTLGPUFamilyMetal3 (5001)\nggml_metal_device_init: simdgroup reduction = true\nggml_metal_device_init: simdgroup matrix mul. = true\nggml_metal_device_init: has unified memory = true\nggml_metal_device_init: has bfloat = true\nggml_metal_device_init: has tensor = false\nggml_metal_device_init: use residency sets = true\nggml_metal_device_init: use shared buffers = true\nggml_metal_device_init: recommendedMaxWorkingSetSize = 11453.25 MB\nwhisper_init_with_params_no_state: devices = 3\nwhisper_init_with_params_no_state: backends = 3\nwhisper_model_load: loading model\nwhisper_model_load: n_vocab = 51865\nwhisper_model_load: n_audio_ctx = 1500\nwhisper_model_load: n_audio_state = 384\nwhisper_model_load: n_audio_head = 6\nwhisper_model_load: n_audio_layer = 4\nwhisper_model_load: n_text_ctx = 448\nwhisper_model_load: n_text_state = 384\nwhisper_model_load: n_text_head = 6\nwhisper_model_load: n_text_layer = 4\nwhisper_model_load: n_mels = 80\nwhisper_model_load: ftype = 1\nwhisper_model_load: qntvr = 0\nwhisper_model_load: type = 1 (tiny)\nwhisper_model_load: adding 1608 extra tokens\nwhisper_model_load: n_langs = 99\nwhisper_model_load: Metal total size = 77.11 MB\nwhisper_model_load: model size = 77.11 MB\n2026-05-06T20:27:44.857210Z INFO screenpipe_audio::transcription::engine: whisper model loaded successfully\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\n2026-05-06T20:27:44.861912Z INFO screenpipe_audio::audio_manager::manager: transcription session created (will be reused across segments)\n2026-05-06T20:27:44.862480Z INFO screenpipe_audio::audio_manager::manager: audio manager started\n2026-05-06T20:27:44.862525Z INFO screenpipe_audio::audio_manager::manager: calendar-assisted speaker diarization: listening for meeting events\n2026-05-06T20:27:47.831980Z INFO screenpipe_audio::device::device_manager: starting recording for device: System Audio (output)\n2026-05-06T20:27:47.832191Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for System Audio (output) (unknown / 30s segments)\n2026-05-06T20:27:47.906029Z INFO screenpipe_audio::device::device_manager: starting recording for device: MacBook Pro Microphone (input)\n2026-05-06T20:27:47.906090Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for MacBook Pro Microphone (input) (wired / 30s segments)\n2026-05-06T20:28:15.251258Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8608554010568040663, trigger=visual_change)\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\n2026-05-06T20:29:45.187551Z INFO screenpipe_audio::audio_manager::manager: reconciliation: transcribed 6 orphaned chunks\n2026-05-06T20:30:06.916244Z WARN screenpipe_audio::core::source_buffer: [MacBook Pro Microphone (input)] large gap on wired device: 81.4ms elapsed (expected 5.3ms) → inserting 76.0ms silence (7299 samples)\n2026-05-06T20:30:29.881247Z WARN screenpipe_audio::core::source_buffer: [MacBook Pro Microphone (input)] large gap on wired device: 96.0ms elapsed (expected 5.3ms) → inserting 90.7ms silence (8704 samples)\n^C2026-05-06T20:31:44.992913Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-05-06T20:31:44.993815Z INFO screenpipe_audio::device::device_manager: Stopping device: System Audio (output)\n2026-05-06T20:31:44.993845Z INFO screenpipe_audio::device::device_manager: Stopping device: System Audio (output)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ 2026-05-06T20:31:45.865813Z INFO screenpipe_audio::device::device_manager: Stopping device: MacBook Pro Microphone (input)\n2026-05-06T20:31:45.865820Z INFO screenpipe_audio::device::device_manager: Stopping device: MacBook Pro Microphone (input)\n2026-05-06T20:31:45.892593Z INFO screenpipe_audio::audio_manager::manager: audio manager stopped\n2026-05-06T20:31:45.892684Z INFO screenpipe: stopping UI event capture\n2026-05-06T20:31:45.893002Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-05-06T20:31:45.893977Z INFO screenpipe: received shutdown signal for VisionManager\n2026-05-06T20:31:45.894556Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-05-06T20:31:45.894516Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-05-06T20:31:45.894602Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-05-06T20:31:45.895419Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-05-06T20:31:45.895898Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-05-06T20:31:45.980559Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 54869993-7b4b-491f-b717-2a583517f9c5\n2026-05-06T20:31:45.980777Z INFO screenpipe: shutdown complete\nggml_metal_free: deallocating\n2026-05-06T20:31:46.374234Z ERROR screenpipe_engine::event_driven_capture: event capture failed (trigger=click, monitor=1): monitor capture failed: capture task panicked: task 770 was cancelled\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ;3B\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-05-06T20:32:21.850318Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-05-06T20:32:21.937393Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-05-06T20:32:23.002257Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-05-06T20:32:23.006683Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-05-06T20:32:23.008348Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-05-06T20:32:23.030912Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-05-06T20:32:23.030979Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-05-06T20:32:23.031261Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-05-06T20:32:23.031328Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-05-06T20:32:23.031199Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-05-06T20:32:23.031387Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-05-06T20:32:23.031253Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-05-06T20:32:23.034682Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-05-06T20:32:23.035042Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-05-06T20:32:23.035480Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-05-06T20:32:23.035607Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-05-06T20:32:23.035705Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-05-06T20:32:23.035815Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-05-06T20:32:23.035838Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-05-06T20:32:23.037534Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n│ retention mode │ media-only (keep transcripts) │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-05-06T20:32:23.038046Z INFO screenpipe: starting UI event capture\n2026-05-06T20:32:23.058967Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-05-06T20:32:23.060289Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(95))\n2026-05-06T20:32:23.082491Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-05-06T20:32:23.103681Z INFO screenpipe_engine::ui_recorder: UI recording session started: 83716bbd-ad71-45f9-9fba-e5b2bd8a5a97\n2026-05-06T20:32:23.103826Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-05-06T20:32:23.103903Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-05-05 17:32:23.103901 UTC to 2026-05-06 17:32:23.103901 UTC)\n2026-05-06T20:32:23.107276Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-05-06T20:32:23.116788Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-05-06T20:32:23.126899Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-05-06T20:32:23.132524Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 52 frame entries, coverage from 2026-05-05 17:32:23.103901 UTC\n2026-05-06T20:32:24.842085Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-05-06T20:32:24.842155Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-05-06T20:32:24.842202Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-05-06T20:32:25.405285Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-05-06T20:32:25.405525Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-05-06T20:32:25.405604Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-05-06T20:32:25.405641Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-05-06T20:32:25.405632Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-05-06T20:32:27.627877Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 3 excluded)\n2026-05-06T20:32:28.150868Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=53, dur=82ms\n2026-05-06T20:32:28.853394Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)","depth":4,"on_screen":true,"value":"[2026-05-06 19:41:28] Archive DB size: 9.7G\n[2026-05-06 19:41:28] Total time: 19m12s\n[2026-05-06 19:41:28] Sync complete for 2026-04-27\n[2026-05-06 19:41:28] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28\n[2026-05-06 19:44:49] ========================================\n[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28\n[2026-05-06 19:44:49] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK ( 11G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists (9.7G)\n Data dir: OK (223 files, 159M)\n\n[+00m00s] ▶ Counting source rows for 2026-04-28\n frames: 4535\n elements: 407532\n ui_events: 8621\n ocr_text: 1623\n meetings: 3\n\n[+00m02s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m00s\n creating FTS tables ✓ 0m00s\n\n[+00m02s] ▶ Syncing data for 2026-04-28\n video_chunks ✓ 0m12s\n frames (4535 rows) ✓ 1m30s\n ocr_text (1623 rows) ✓ 0m32s\n ui_events (8621 rows) ✓ 0m01s\n elements (407532 rows) ✓ 1m02s\n meetings (3 rows) ✓ 0m00s\n\n[+03m19s] ▶ Updating FTS indexes\n elements_fts ✓ 1m36s\n frames_fts ✓ 2m28s\n ui_events_fts ✓ 0m04s\n\n[+07m27s] ▶ Verifying DB\n frames: 4535 / 4535 ✓\n elements: 407532 / 407532 ✓\n ui_events: 8621 / 8621 ✓\n ocr_text: 1623 / 1623 ✓\n meetings: 3 / 3 ✓\n\n[+08m59s] ▶ Copying data folder for 2026-04-28\n rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)\n\n[2026-05-06 19:54:08] Archive DB size: 10G\n[2026-05-06 19:54:08] Total time: 9m19s\n[2026-05-06 19:54:08] Sync complete for 2026-04-28\n[2026-05-06 19:54:08] ========================================\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll\ntotal 24\ndrwx------ 9 lukas staff 288 28 Apr 09:18 .\ndrwx------+ 92 lukas staff 2944 6 May 20:22 ..\ndrwx------ 5 lukas staff 160 1 Nov 2021 _cacache\ndrwx------@ 2 lukas staff 64 28 Apr 09:18 _locks\ndrwx------ 15 lukas staff 480 27 Apr 19:54 _logs\ndrwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx\n-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked\n-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json\n-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll \ntotal 52920\ndrwx------+ 92 lukas staff 2944 6 May 20:22 .\ndrwxr-xr-x 5 root admin 160 23 Aug 2024 ..\n-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding\n-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store\ndrwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash\ndrwx------ 5 lukas staff 160 1 Nov 2021 .aws\n-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json\n-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history\n-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc\ndrwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito\ndrwx------@ 6 lukas staff 192 9 Apr 19:53 .cache\ndrwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude\n-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json\ndrwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium\ndrwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer\ndrwx------ 16 lukas staff 512 21 May 2025 .config\ndrwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue\ndrwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot\ndrwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor\ndrwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor\ndrwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona\ndrwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb\ndrwx------ 24 lukas staff 768 27 Apr 18:14 .docker\ndrwx------ 15 lukas staff 480 6 Jun 2023 .dropbox\ndrwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak\n-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth\n-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig\n-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp\ndrwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon\ndrwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc\n-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst\ndrwx------ 5 lukas staff 160 23 Dec 2024 .local\n-rw------- 1 lukas staff 204 16 Mar 2024 .netrc\ndrwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp\n-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history\n-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer\ndrwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py\ndrwx------ 8 lukas staff 256 6 May 20:24 .npm\n-rw------- 1 lukas staff 74 20 May 2024 .npmrc\ndrwx------ 32 lukas staff 1024 25 Jul 2025 .nvm\ndrwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile\n-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history\ndrwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode\ndrwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight\ndrwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint\ndrwx------ 15 lukas staff 480 8 Aug 2025 .ssh\ndrwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit\ndrwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm\n-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\n UW PICO 5.09 New Buffer \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n [ Read 1 line ] \n^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos \n^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell \ndrwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm\ndrwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf\ndrwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn\n-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc\n-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile\n-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy\n-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave\n-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save\n-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees\n-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc\ndrwx------@ 9 lukas staff 288 20 Apr 20:55 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV\ndrwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads\ndrwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen\ndrwx------@ 112 lukas staff 3584 2 Dec 09:19 Library\ndrwx------ 7 lukas staff 224 12 Feb 2024 Movies\ndrwx------+ 5 lukas staff 160 25 Sep 2023 Music\ndrwx------+ 9 lukas staff 288 25 Sep 2023 Pictures\ndrwx------ 3 lukas staff 96 8 Nov 2021 Postman\ndrwx------+ 4 lukas staff 128 28 Oct 2021 Public\n-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf\ndrwx------ 4 lukas staff 128 2 Jul 2023 Users\n-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log\n-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4\n-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 2025 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast\n-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin\n-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh\n-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe\ncd: no such file or directory: /Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows \"Boosteroid\" --retention-days 7\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated\nchecking permissions...\n screen recording: ok\n microphone: ok\n accessibility: ok\n2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap\n2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update\n2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits\n2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown\n2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export\n2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary\n2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ false │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 7 │\n│ retention mode │ media-only (keep transcripts) │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ MacBook Pro Microphone (input) │\n│ │ System Audio (output) │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-05-06T20:27:34.638384Z INFO screenpipe: starting UI event capture\n2026-05-06T20:27:34.637679Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-05-06T20:27:34.649154Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(94))\n2026-05-06T20:27:34.652794Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-05-06T20:27:34.655839Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-05-06T20:27:34.673877Z INFO screenpipe_engine::ui_recorder: UI recording session started: 54869993-7b4b-491f-b717-2a583517f9c5\n2026-05-06T20:27:34.673910Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-05-06T20:27:34.674057Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-05-05 17:27:34.674056 UTC to 2026-05-06 17:27:34.674056 UTC)\n2026-05-06T20:27:34.674892Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-05-06T20:27:34.675788Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 0 frame entries, coverage from 2026-05-05 17:27:34.674056 UTC\n2026-05-06T20:27:34.686546Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-05-06T20:27:34.691371Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-05-06T20:27:36.270608Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-05-06T20:27:36.270669Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.270714Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-05-06T20:27:36.932583Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-05-06T20:27:36.932852Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-05-06T20:27:36.932882Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-05-06T20:27:36.932899Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-05-06T20:27:36.932901Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-05-06T20:27:39.158281Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 3 excluded)\n2026-05-06T20:27:39.593177Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1, dur=101ms\n2026-05-06T20:27:40.672366Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)\n2026-05-06T20:27:41.257664Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 2: frame_id=2, dur=140ms\n2026-05-06T20:27:44.641022Z INFO screenpipe_audio::transcription::engine: whisper model available: \"/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin\"\n2026-05-06T20:27:44.641079Z INFO screenpipe_audio::transcription::whisper::model: whisper context: gpu acceleration enabled (Metal on macOS, Vulkan on Windows)\n2026-05-06T20:27:44.641086Z INFO screenpipe_audio::transcription::engine: loading whisper model with GPU acceleration...\nwhisper_init_from_file_with_params_no_state: loading model from '/Users/lukas/.cache/huggingface/hub/models--ggerganov--whisper.cpp/snapshots/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-tiny.bin'\nwhisper_init_with_params_no_state: use gpu = 1\nwhisper_init_with_params_no_state: flash attn = 0\nwhisper_init_with_params_no_state: gpu_device = 0\nwhisper_init_with_params_no_state: dtw = 0\nggml_metal_device_init: tensor API disabled for pre-M5 and pre-A19 devices\nggml_metal_library_init: using embedded metal library\nggml_metal_library_init: loaded in 0.041 sec\nggml_metal_rsets_init: creating a residency set collection (keep_alive = 180 s)\nggml_metal_device_init: GPU name: Apple M1\nggml_metal_device_init: GPU family: MTLGPUFamilyApple7 (1007)\nggml_metal_device_init: GPU family: MTLGPUFamilyCommon3 (3003)\nggml_metal_device_init: GPU family: MTLGPUFamilyMetal3 (5001)\nggml_metal_device_init: simdgroup reduction = true\nggml_metal_device_init: simdgroup matrix mul. = true\nggml_metal_device_init: has unified memory = true\nggml_metal_device_init: has bfloat = true\nggml_metal_device_init: has tensor = false\nggml_metal_device_init: use residency sets = true\nggml_metal_device_init: use shared buffers = true\nggml_metal_device_init: recommendedMaxWorkingSetSize = 11453.25 MB\nwhisper_init_with_params_no_state: devices = 3\nwhisper_init_with_params_no_state: backends = 3\nwhisper_model_load: loading model\nwhisper_model_load: n_vocab = 51865\nwhisper_model_load: n_audio_ctx = 1500\nwhisper_model_load: n_audio_state = 384\nwhisper_model_load: n_audio_head = 6\nwhisper_model_load: n_audio_layer = 4\nwhisper_model_load: n_text_ctx = 448\nwhisper_model_load: n_text_state = 384\nwhisper_model_load: n_text_head = 6\nwhisper_model_load: n_text_layer = 4\nwhisper_model_load: n_mels = 80\nwhisper_model_load: ftype = 1\nwhisper_model_load: qntvr = 0\nwhisper_model_load: type = 1 (tiny)\nwhisper_model_load: adding 1608 extra tokens\nwhisper_model_load: n_langs = 99\nwhisper_model_load: Metal total size = 77.11 MB\nwhisper_model_load: model size = 77.11 MB\n2026-05-06T20:27:44.857210Z INFO screenpipe_audio::transcription::engine: whisper model loaded successfully\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\n2026-05-06T20:27:44.861912Z INFO screenpipe_audio::audio_manager::manager: transcription session created (will be reused across segments)\n2026-05-06T20:27:44.862480Z INFO screenpipe_audio::audio_manager::manager: audio manager started\n2026-05-06T20:27:44.862525Z INFO screenpipe_audio::audio_manager::manager: calendar-assisted speaker diarization: listening for meeting events\n2026-05-06T20:27:47.831980Z INFO screenpipe_audio::device::device_manager: starting recording for device: System Audio (output)\n2026-05-06T20:27:47.832191Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for System Audio (output) (unknown / 30s segments)\n2026-05-06T20:27:47.906029Z INFO screenpipe_audio::device::device_manager: starting recording for device: MacBook Pro Microphone (input)\n2026-05-06T20:27:47.906090Z INFO screenpipe_audio::core::run_record_and_transcribe: starting continuous recording for MacBook Pro Microphone (input) (wired / 30s segments)\n2026-05-06T20:28:15.251258Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8608554010568040663, trigger=visual_change)\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\nwhisper_backend_init_gpu: device 0: Metal (type: 1)\nwhisper_backend_init_gpu: found GPU device 0: Metal (type: 1, cnt: 0)\nwhisper_backend_init_gpu: using Metal backend\nggml_metal_init: allocating\nggml_metal_init: found device: Apple M1\nggml_metal_init: picking default device: Apple M1\nggml_metal_init: use fusion = true\nggml_metal_init: use concurrency = true\nggml_metal_init: use graph optimize = true\nwhisper_backend_init: using BLAS backend\nwhisper_init_state: kv self size = 3.15 MB\nwhisper_init_state: kv cross size = 9.44 MB\nwhisper_init_state: kv pad size = 2.36 MB\nwhisper_init_state: compute buffer (conv) = 14.17 MB\nwhisper_init_state: compute buffer (encode) = 65.96 MB\nwhisper_init_state: compute buffer (cross) = 8.50 MB\nwhisper_init_state: compute buffer (decode) = 96.83 MB\nggml_metal_free: deallocating\n2026-05-06T20:29:45.187551Z INFO screenpipe_audio::audio_manager::manager: reconciliation: transcribed 6 orphaned chunks\n2026-05-06T20:30:06.916244Z WARN screenpipe_audio::core::source_buffer: [MacBook Pro Microphone (input)] large gap on wired device: 81.4ms elapsed (expected 5.3ms) → inserting 76.0ms silence (7299 samples)\n2026-05-06T20:30:29.881247Z WARN screenpipe_audio::core::source_buffer: [MacBook Pro Microphone (input)] large gap on wired device: 96.0ms elapsed (expected 5.3ms) → inserting 90.7ms silence (8704 samples)\n^C2026-05-06T20:31:44.992913Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-05-06T20:31:44.993815Z INFO screenpipe_audio::device::device_manager: Stopping device: System Audio (output)\n2026-05-06T20:31:44.993845Z INFO screenpipe_audio::device::device_manager: Stopping device: System Audio (output)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ 2026-05-06T20:31:45.865813Z INFO screenpipe_audio::device::device_manager: Stopping device: MacBook Pro Microphone (input)\n2026-05-06T20:31:45.865820Z INFO screenpipe_audio::device::device_manager: Stopping device: MacBook Pro Microphone (input)\n2026-05-06T20:31:45.892593Z INFO screenpipe_audio::audio_manager::manager: audio manager stopped\n2026-05-06T20:31:45.892684Z INFO screenpipe: stopping UI event capture\n2026-05-06T20:31:45.893002Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n2026-05-06T20:31:45.893977Z INFO screenpipe: received shutdown signal for VisionManager\n2026-05-06T20:31:45.894556Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-05-06T20:31:45.894516Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down\n2026-05-06T20:31:45.894602Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-05-06T20:31:45.895419Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2\n2026-05-06T20:31:45.895898Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-05-06T20:31:45.980559Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 54869993-7b4b-491f-b717-2a583517f9c5\n2026-05-06T20:31:45.980777Z INFO screenpipe: shutdown complete\nggml_metal_free: deallocating\n2026-05-06T20:31:46.374234Z ERROR screenpipe_engine::event_driven_capture: event capture failed (trigger=click, monitor=1): monitor capture failed: capture task panicked: task 770 was cancelled\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ;3B\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\ndetected hardware tier: Mid\nwarning: parakeet is not supported on this platform, using whisper-tiny instead\n2026-05-06T20:32:21.850318Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-05-06T20:32:21.937393Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-05-06T20:32:23.002257Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-05-06T20:32:23.006683Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-05-06T20:32:23.008348Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-05-06T20:32:23.030912Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true\n2026-05-06T20:32:23.030979Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-05-06T20:32:23.031261Z INFO screenpipe: API server listening on 127.0.0.1:3030 (localhost only)\n2026-05-06T20:32:23.031328Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-05-06T20:32:23.031199Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-05-06T20:32:23.031387Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key\n2026-05-06T20:32:23.031253Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-05-06T20:32:23.034682Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-05-06T20:32:23.035042Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-05-06T20:32:23.035480Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-05-06T20:32:23.035607Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-05-06T20:32:23.035705Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-05-06T20:32:23.035815Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-05-06T20:32:23.035838Z INFO screenpipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.screenpipe/pipes\"\n\n\n\n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n\n\n\npower AI by everything you've seen, said or heard\nopen source | runs locally | developer friendly\n\n\n┌────────────────────────┬────────────────────────────────────┐\n│ setting │ value │\n├────────────────────────┼────────────────────────────────────┤\n│ audio chunk duration │ 30 seconds │\n│ port │ 3030 │\n│ audio disabled │ true │\n│ vision disabled │ false │\n│ pause on DRM content │ false │\n│ audio engine │ Parakeet │\n│ vad engine │ Silero │\n│ data directory │ /Users/lukas/.screenpipe │\n│ debug mode │ false │\n│ telemetry │ true │\n│ use pii removal │ true │\n│ use all monitors │ true │\n2026-05-06T20:32:23.037534Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n│ ignored windows │ [\"Boosteroid\"] │\n│ included windows │ [] │\n│ cloud sync │ disabled │\n│ auto-destruct pid │ 0 │\n│ deepgram key │ not set │\n│ api auth │ enabled │\n│ encrypt secrets │ disabled │\n│ retention days │ 14 │\n│ retention mode │ media-only (keep transcripts) │\n├────────────────────────┼────────────────────────────────────┤\n│ languages │ │\n│ │ all languages │\n├────────────────────────┼────────────────────────────────────┤\n│ monitors │ │\n│ │ id: 1 │\n│ │ id: 2 │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ disabled │\n└────────────────────────┴────────────────────────────────────┘\nyou are using local processing. all your data stays on your computer.\n\nwarning: telemetry is enabled. only error-level data will be sent.\nto disable, use the --disable-telemetry flag.\n\ncheck latest changes here: https://github.com/screenpipe/screenpipe/releases\n2026-05-06T20:32:23.038046Z INFO screenpipe: starting UI event capture\n2026-05-06T20:32:23.058967Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-05-06T20:32:23.060289Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(95))\n2026-05-06T20:32:23.082491Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-05-06T20:32:23.103681Z INFO screenpipe_engine::ui_recorder: UI recording session started: 83716bbd-ad71-45f9-9fba-e5b2bd8a5a97\n2026-05-06T20:32:23.103826Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-05-06T20:32:23.103903Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-05-05 17:32:23.103901 UTC to 2026-05-06 17:32:23.103901 UTC)\n2026-05-06T20:32:23.107276Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-05-06T20:32:23.116788Z INFO screenpipe_engine::server: Server listening on 127.0.0.1:3030\n2026-05-06T20:32:23.126899Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-05-06T20:32:23.132524Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 52 frame entries, coverage from 2026-05-05 17:32:23.103901 UTC\n2026-05-06T20:32:24.842085Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-05-06T20:32:24.842155Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-05-06T20:32:24.842202Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-05-06T20:32:25.405285Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 2 (3008x1253)\n2026-05-06T20:32:25.405525Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 2 (device: monitor_2)\n2026-05-06T20:32:25.405604Z INFO screenpipe_engine::vision_manager::manager: VisionManager started with 2/2 monitor(s)\n2026-05-06T20:32:25.405641Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (event-driven via CGDisplayRegisterReconfigurationCallback, 60s backstop poll)\n2026-05-06T20:32:25.405632Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 2 (device: monitor_2)\n2026-05-06T20:32:27.627877Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps, 3 excluded)\n2026-05-06T20:32:28.150868Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=53, dur=82ms\n2026-05-06T20:32:28.853394Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)","is_focused":true},{"role":"AXTextField","text":"you","depth":3,"bounds":{"left":0.64793885,"top":1.0,"width":0.0625,"height":-0.07581806},"on_screen":true,"automation_id":"_NS:65","value":"you","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"search","depth":4,"bounds":{"left":0.64860374,"top":1.0,"width":0.00831117,"height":-0.07581806},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"cancel","depth":4,"bounds":{"left":0.7017952,"top":1.0,"width":0.00731383,"height":-0.07581806},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go left","depth":3,"bounds":{"left":0.7130984,"top":1.0,"width":0.006981383,"height":-0.07661617},"on_screen":true,"automation_id":"_NS:59","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXButton","text":"go right","depth":3,"bounds":{"left":0.7200798,"top":1.0,"width":0.006981383,"height":-0.07661617},"on_screen":true,"automation_id":"_NS:49","role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.3487367,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.35073137,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.42719415,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42918882,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.58410907,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.58610374,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.6625665,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.66456115,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\"","depth":1,"bounds":{"left":0.4956782,"top":1.0,"width":0.027925532,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
-3153548874318014895
|
4336429617218774369
|
manual
|
accessibility
|
NULL
|
[2026-05-06 19:41:28] Archive DB size: 9.7G
[2026 [2026-05-06 19:41:28] Archive DB size: 9.7G
[2026-05-06 19:41:28] Total time: 19m12s
[2026-05-06 19:41:28] Sync complete for 2026-04-27
[2026-05-06 19:41:28] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-04-28
[2026-05-06 19:44:49] ========================================
[2026-05-06 19:44:49] Screenpipe sync starting for: 2026-04-28
[2026-05-06 19:44:49] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK ( 11G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists (9.7G)
Data dir: OK (223 files, 159M)
[+00m00s] ▶ Counting source rows for 2026-04-28
frames: 4535
elements: 407532
ui_events: 8621
ocr_text: 1623
meetings: 3
[+00m02s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m00s
creating FTS tables ✓ 0m00s
[+00m02s] ▶ Syncing data for 2026-04-28
video_chunks ✓ 0m12s
frames (4535 rows) ✓ 1m30s
ocr_text (1623 rows) ✓ 0m32s
ui_events (8621 rows) ✓ 0m01s
elements (407532 rows) ✓ 1m02s
meetings (3 rows) ✓ 0m00s
[+03m19s] ▶ Updating FTS indexes
elements_fts ✓ 1m36s
frames_fts ✓ 2m28s
ui_events_fts ✓ 0m04s
[+07m27s] ▶ Verifying DB
frames: 4535 / 4535 ✓
elements: 407532 / 407532 ✓
ui_events: 8621 / 8621 ✓
ocr_text: 1623 / 1623 ✓
meetings: 3 / 3 ✓
[+08m59s] ▶ Copying data folder for 2026-04-28
rsync 2026-04-28/ → NAS ✓ 0m20s (223 files, 159M)
[2026-05-06 19:54:08] Archive DB size: 10G
[2026-05-06 19:54:08] Total time: 9m19s
[2026-05-06 19:54:08] Sync complete for 2026-04-28
[2026-05-06 19:54:08] ========================================
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ pkill -f screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ rm -rf ~/.screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd .npm
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ ll
total 24
drwx------ 9 lukas staff 288 28 Apr 09:18 .
drwx------+ 92 lukas staff 2944 6 May 20:22 ..
drwx------ 5 lukas staff 160 1 Nov 2021 _cacache
drwx------@ 2 lukas staff 64 28 Apr 09:18 _locks
drwx------ 15 lukas staff 480 27 Apr 19:54 _logs
drwxr-xr-x 67 lukas staff 2144 28 Apr 09:17 _npx
-rw-r--r--@ 1 lukas staff 0 26 Apr 19:10 _update-notifier-last-checked
-rw-r--r-- 1 lukas staff 173 28 Apr 09:18 anonymous-cli-metrics.json
-rw-r--r-- 1 lukas staff 4764 31 Jan 2024 eresolve-report.txt
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ rm -rf ~/.npm/_npx
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.npm $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 52920
drwx------+ 92 lukas staff 2944 6 May 20:22 .
drwxr-xr-x 5 root admin 160 23 Aug 2024 ..
-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding
-rw-r--r--@ 1 lukas staff 28676 27 Apr 09:11 .DS_Store
drwx------+ 10 lukas staff 320 28 Apr 17:07 .Trash
drwx------ 5 lukas staff 160 1 Nov 2021 .aws
-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json
-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history
-rw-r--r--@ 1 lukas staff 115 18 Apr 13:19 .bashrc
drwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito
drwx------@ 6 lukas staff 192 9 Apr 19:53 .cache
drwxr-xr-x 20 lukas staff 640 27 Apr 08:58 .claude
-rw------- 1 lukas staff 28647 27 Apr 09:12 .claude.json
drwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium
drwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer
drwx------ 16 lukas staff 512 21 May 2025 .config
drwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue
drwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot
drwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor
drwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor
drwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona
drwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb
drwx------ 24 lukas staff 768 27 Apr 18:14 .docker
drwx------ 15 lukas staff 480 6 Jun 2023 .dropbox
drwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak
-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth
-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig
-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp
drwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon
drwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc
-rw------- 1 lukas staff 20 28 Apr 16:51 .lesshst
drwx------ 5 lukas staff 160 23 Dec 2024 .local
-rw------- 1 lukas staff 204 16 Mar 2024 .netrc
drwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp
-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history
-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer
drwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py
drwx------ 8 lukas staff 256 6 May 20:24 .npm
-rw------- 1 lukas staff 74 20 May 2024 .npmrc
drwx------ 32 lukas staff 1024 25 Jul 2025 .nvm
drwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile
-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history
drwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode
drwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight
drwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint
drwx------ 15 lukas staff 480 8 Aug 2025 .ssh
drwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit
drwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm
-rw------- 1 lukas staff 12143 27 Apr 14:58 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
UW PICO 5.09 New Buffer
[ Read 1 line ]
^G Get Help ^O WriteOut ^R Read File ^Y Prev Pg ^K Cut Text ^C Cur Pos
^X Exit ^J Justify ^W Where is ^V Next Pg ^U UnCut Text ^T To Spell
drwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm
drwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf
drwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn
-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc
-rw-r--r-- 1 lukas staff 49518 21 Apr 09:09 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 2025 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 6116 20 Apr 19:52 .zprofile
-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy
-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave
-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save
-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees
-rw------- 1 lukas staff 50310 28 Apr 11:32 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 400 18 Apr 13:19 .zshrc
drwx------@ 9 lukas staff 288 20 Apr 20:55 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 2025 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 2025 DEV
drwx------@ 10 lukas staff 320 28 Apr 18:52 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 44 lukas staff 1408 24 Apr 16:53 Downloads
drwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen
drwx------@ 112 lukas staff 3584 2 Dec 09:19 Library
drwx------ 7 lukas staff 224 12 Feb 2024 Movies
drwx------+ 5 lukas staff 160 25 Sep 2023 Music
drwx------+ 9 lukas staff 288 25 Sep 2023 Pictures
drwx------ 3 lukas staff 96 8 Nov 2021 Postman
drwx------+ 4 lukas staff 128 28 Oct 2021 Public
-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf
drwx------ 4 lukas staff 128 2 Jul 2023 Users
-rw-r--r-- 1 lukas staff 17050804 27 Apr 19:18 cleanshot-live.log
-rw-r--r-- 1 lukas staff 9363061 27 Apr 19:24 cleanshot-screenpipe.log
-rw-r--r-- 1 lukas staff 0 12 Apr 12:50 clip.mp4
-rw-r--r-- 1 lukas staff 0 12 Apr 12:51 frame.jpg
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 2025 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 2025 raycast
-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin
-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh
-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
cd: no such file or directory: /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ touch screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano screenpipe_sync.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record --ignored-windows "Boosteroid" --retention-days 7
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-05-06T20:27:32.721416Z INFO screenpipe_engine::auth_key: api auth: key resolved via auto-generated
checking permissions...
screen recording: ok
microphone: ok
accessibility: ok
2026-05-06T20:27:32.831033Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-05-06T20:27:34.088403Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-05-06T20:27:34.089942Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-05-06T20:27:34.090417Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-05-06T20:27:34.112650Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-05-06T20:27:34.112711Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-05-06T20:27:34.619906Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-05-06T20:27:34.619937Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-05-06T20:27:34.619857Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-05-06T20:27:34.619847Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-05-06T20:27:34.620018Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-05-06T20:27:34.624746Z INFO screenpipe_core::pipes: installed built-in pipe: day-recap
2026-05-06T20:27:34.626304Z INFO screenpipe_core::pipes: installed built-in pipe: standup-update
2026-05-06T20:27:34.628597Z INFO screenpipe_core::pipes: installed built-in pipe: ai-habits
2026-05-06T20:27:34.629463Z INFO screenpipe_core::pipes: installed built-in pipe: time-breakdown
2026-05-06T20:27:34.630081Z INFO screenpipe_core::pipes: installed built-in pipe: video-export
2026-05-06T20:27:34.630972Z INFO screenpipe_core::pipes: installed built-in pipe: meeting-summary
2026-05-06T20:27:34.631427Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-05-06T20:27:34.631521Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-05-06T20:27:34.631587Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-05-06T20:27:34.631640Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-05-06T20:27:34.631690Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-05-06T20:27:34.631738Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-05-06T20:27:34.631752Z INFO screenpipe_core::pipes: loaded 6 pipes from "/Users/lukas/.screenpipe/pipes"
_
__________________ ___ ____ ____ (_____ ___
/ ___/ ___/ ___/ _ \/ _ \/ __ \ / __ \/ / __ \/ _ \
(__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/
/____/\___/_/ \___/\___/_/ /_/ / .___/_/ .___/\___/
/_/ /_/
power AI by everything you've seen, said or heard
open source | runs locally | developer friendly
┌────────────────────────┬────────────────────────────────────┐
│ setting │ value │
├────────────────────────┼────────────────────────────────────┤
│ audio chunk duration │ 30 seconds │
│ port │ 3030 │
│ audio disabled │ false │
│ vision disabled │ false │
│ pause on DRM content │ false │
│ audio engine │ Parakeet │
│ vad engine │ Silero │
│ data directory │ /Users/lukas/.screenpipe │
│ debug mode │ false │
│ telemetry │ true │
│ use pii removal │ true │
│ use all monitors │ true │
│ ignored windows │ ["Boosteroid"] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
│ api auth │ enabled │
│ encrypt secrets │ disabled │
│ retention days │ 7 │
│ retention mode │ media-only (keep transcripts) │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ id: 1 │
│ │ id: 2 │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ MacBook Pro Microphone (input) │
│ │ System Audio (output) │
└────────────────────────┴────────────────────────────────────┘
you are using local processing. all your data stays on your computer.
warning: telemetry is enabled. only error-level data will be sent.
to disable, use the --disable-telemetry flag.
check latest changes here: [URL_WITH_CREDENTIALS] ~ $ 2026-05-06T20:31:45.865813Z INFO screenpipe_audio::device::device_manager: Stopping device: MacBook Pro Microphone (input)
2026-05-06T20:31:45.865820Z INFO screenpipe_audio::device::device_manager: Stopping device: MacBook Pro Microphone (input)
2026-05-06T20:31:45.892593Z INFO screenpipe_audio::audio_manager::manager: audio manager stopped
2026-05-06T20:31:45.892684Z INFO screenpipe: stopping UI event capture
2026-05-06T20:31:45.893002Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop
2026-05-06T20:31:45.893977Z INFO screenpipe: received shutdown signal for VisionManager
2026-05-06T20:31:45.894556Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager
2026-05-06T20:31:45.894516Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker shutting down
2026-05-06T20:31:45.894602Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager
2026-05-06T20:31:45.895419Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 2
2026-05-06T20:31:45.895898Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1
2026-05-06T20:31:45.980559Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 54869993-7b4b-491f-b717-2a583517f9c5
2026-05-06T20:31:45.980777Z INFO screenpipe: shutdown complete
ggml_metal_free: deallocating
2026-05-06T20:31:46.374234Z ERROR screenpipe_engine::event_driven_capture: event capture failed (trigger=click, monitor=1): monitor capture failed: capture task panicked: task 770 was cancelled
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ;3B
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start
detected hardware tier: Mid
warning: parakeet is not supported on this platform, using whisper-tiny instead
2026-05-06T20:32:21.850318Z INFO screenpipe_engine::auth_key: api auth: key resolved via secret store
checking permissions...
screen recording: ok
accessibility: ok
2026-05-06T20:32:21.937393Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-05-06T20:32:23.002257Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-05-06T20:32:23.006683Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-05-06T20:32:23.008348Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-05-06T20:32:23.030912Z INFO screenpipe_engine::permission_monitor: permission monitor started screen=true mic=true accessibility=true keychain=true
2026-05-06T20:32:23.030979Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-05-06T20:32:23.031261Z INFO screenpipe: API server listening on [IP_ADDRESS]:3030 (localhost only)
2026-05-06T20:32:23.031328Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-05-06T20:32:23.031199Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-05-06T20:32:23.031387Z INFO screenpipe: API auth enabled — run `screenpipe auth token` to view your key
2026-05-06T20:32:23.031253Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-05-06T20:32:23.034682Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-05-06T20:32:23.035042Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-05-06T20:32:23.035480Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-05-06T20:32:23.035607Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-05-06T20:32:23.035705Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-05-06T20:32:23.035815Z INFO screenpipe_...
|
NULL
|
NULL
|
|
74140
|
NULL
|
0
|
2026-04-23T09:04:49.035193+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-23/1776 /Users/lukas/.screenpipe/data/data/2026-04-23/1776935089035_m2.jpg...
|
iTerm2
|
screenpipe" — 95✕45
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
2026-04-23T09:13:09.380863Z INFO sck_rs::stream_m 2026-04-23T09:13:09.380863Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2
2026-04-23T09:13:32.742255Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)
2026-04-23T09:14:01.764079Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4702465002163205464, trigger=click)
2026-04-23T09:14:04.223149Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4702465002163205464, trigger=visual_change)
2026-04-23T09:14:06.953796Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=147 elapsed=6.3719465s
2026-04-23T09:14:06.954006Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 147 eligible frames
2026-04-23T09:14:12.566935Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 70 frames, 10.3MB → 2.7MB (3.8x), 70 JPEGs deleted
2026-04-23T09:14:17.358704Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 75 frames, 9.6MB → 3.0MB (3.2x), 75 JPEGs deleted
2026-04-23T09:15:47.544198Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3660881845293713510, trigger=visual_change)
2026-04-23T09:15:50.997492Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3660881845293713510, trigger=click)
2026-04-23T09:15:51.600725Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3660881845293713510, trigger=click)
2026-04-23T09:15:55.723800Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3660881845293713510, trigger=click)
2026-04-23T09:15:56.933987Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3660881845293713510, trigger=visual_change)
2026-04-23T09:15:59.012409Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3660881845293713510, trigger=visual_change)
2026-04-23T09:16:49.882963Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3759145274440377841, trigger=visual_change)
2026-04-23T09:16:51.405936Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3759145274440377841, trigger=click)
2026-04-23T09:16:52.823011Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3759145274440377841, trigger=click)
2026-04-23T09:16:54.220304Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3759145274440377841, trigger=click)
2026-04-23T09:16:54.887021Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3759145274440377841, trigger=click)
2026-04-23T09:16:58.589203Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3759145274440377841, trigger=visual_change)
2026-04-23T09:18:05.879649Z WARN screenpipe_db::db: wal checkpoint: busy (could not truncate), 5054 pages in WAL
2026-04-23T09:18:05.879619Z WARN sqlx::query: summary="PRAGMA wal_checkpoint(TRUNCATE)" db.statement="" rows_affected=0 rows_returned=1 elapsed=5.220339167s
2026-04-23T09:19:24.740122Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=2 elapsed=7.381061833s
2026-04-23T09:19:24.740850Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 2 eligible frames
2026-04-23T09:19:36.514406Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2079049776495123607, trigger=click)
2026-04-23T09:24:26.477446Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=11 elapsed=1.729545666s
2026-04-23T09:24:26.477540Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 11 eligible frames
2026-04-23T09:24:27.316363Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 5 frames, 1.4MB → 1.4MB (1.0x), 5 JPEGs deleted
2026-04-23T09:24:27.966623Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 6 frames, 0.6MB → 0.2MB (2.7x), 6 JPEGs deleted
2026-04-23T09:24:42.606557Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:26:03.160247Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7786631749263421517, trigger=click)
2026-04-23T09:27:26.154494Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:27:34.433056Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:28:06.713361Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:28:33.527151Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5209591986308457575, trigger=click)
2026-04-23T09:28:34.249353Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5209591986308457575, trigger=click)
2026-04-23T09:28:36.237199Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5209591986308457575, trigger=click)
2026-04-23T09:28:42.253183Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8747303508868961364, trigger=click)
2026-04-23T09:28:48.282686Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:28:50.613134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:28:51.314522Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:29:31.961577Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=67 elapsed=3.996031s
2026-04-23T09:29:31.961670Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 67 eligible frames
2026-04-23T09:29:34.332658Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 29 frames, 5.8MB → 2.1MB (2.8x), 29 JPEGs deleted
2026-04-23T09:29:38.223511Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 36 frames, 7.4MB → 3.8MB (2.0x), 36 JPEGs deleted
2026-04-23T09:30:34.230785Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:30:39.665086Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:30:40.299751Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:30:45.663893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:30:51.622228Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:30:52.321014Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:31:15.021588Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:31:15.691601Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:31:17.946692Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:31:18.653547Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:32:17.960360Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:32:24.051490Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:32:29.442560Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:32:30.131038Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:32:32.452540Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:32:36.585069Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:32:39.322258Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:33:18.072421Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:33:18.766929Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:33:22.098409Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:33:22.782084Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:34:27.313290Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:34:38.542722Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 89 eligible frames
2026-04-23T09:34:41.684595Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 5.6MB → 0.7MB (7.5x), 38 JPEGs deleted
2026-04-23T09:34:44.933963Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 49 frames, 10.6MB → 3.8MB (2.8x), 49 JPEGs deleted
2026-04-23T09:37:57.963204Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:37:58.697604Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:38:02.124214Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:38:53.190171Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:38:59.279885Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:39:02.308536Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:39:36.189861Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:39:49.122120Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=50 elapsed=4.188474542s
2026-04-23T09:39:49.122232Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 50 eligible frames
2026-04-23T09:39:51.115025Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 2.9MB → 0.3MB (9.4x), 24 JPEGs deleted
2026-04-23T09:39:53.096763Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 5.0MB → 2.3MB (2.2x), 24 JPEGs deleted
2026-04-23T09:40:57.095660Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:40:58.430714Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:41:01.130926Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:41:01.840278Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:41:04.072034Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:41:09.252541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:41:09.972092Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:41:12.313228Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:41:13.696141Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:41:15.723102Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:41:16.452657Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:42:46.382248Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:43:42.993741Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6469703639183038647, trigger=visual_change)
2026-04-23T09:44:17.245560Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7072623502562616708, trigger=visual_change)
2026-04-23T09:44:56.342637Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=21 elapsed=2.944921084s
2026-04-23T09:44:56.343212Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 21 eligible frames
2026-04-23T09:44:57.216675Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.2MB → 0.2MB (6.9x), 10 JPEGs deleted
2026-04-23T09:44:58.298212Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 2.1MB → 0.7MB (2.8x), 9 JPEGs deleted
2026-04-23T09:45:10.982752Z INFO screenpipe_engine::meeting_detector: meeting v2: Idle -> Confirming (app=Firefox, signals=2)
2026-04-23T09:45:16.376695Z INFO screenpipe_engine::meeting_detector: meeting v2: Confirming -> Active (app=Firefox, signals=2, browser=true)
2026-04-23T09:45:16.378791Z INFO screenpipe_engine::meeting_detector: meeting v2: meeting started (id=9, app=Firefox, title=None)
2026-04-23T09:50:01.989691Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=23 elapsed=3.688976042s
2026-04-23T09:50:01.989962Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 23 eligible frames
2026-04-23T09:50:03.098505Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 1.3MB → 0.2MB (7.4x), 11 JPEGs deleted
2026-04-23T09:50:04.627741Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.4MB → 0.8MB (3.1x), 10 JPEGs deleted
2026-04-23T09:50:07.629323Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4672421675042950776, trigger=click)
2026-04-23T09:52:11.400798Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:52:15.346773Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:52:18.174934Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:52:22.107623Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:52:32.020499Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:53:33.890239Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:53:35.304629Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:53:58.176084Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:54:14.248454Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:54:18.287472Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:54:20.289467Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:54:24.904239Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:54:27.981243Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:54:29.172367Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:54:30.192245Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:54:31.161165Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:55:11.821088Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=36 elapsed=7.192436875s
2026-04-23T09:55:11.821248Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 36 eligible frames
2026-04-23T09:55:13.532739Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 2.3MB → 0.5MB (5.0x), 19 JPEGs deleted
2026-04-23T09:55:16.625152Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 15 frames, 3.3MB → 1.4MB (2.4x), 15 JPEGs deleted
2026-04-23T09:56:01.584150Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:56:24.887186Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3078857793355977422, trigger=click)
2026-04-23T09:56:32.005363Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3078857793355977422, trigger=visual_change)
2026-04-23T09:56:41.374227Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3078857793355977422, trigger=visual_change)
2026-04-23T09:56:54.666839Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3078857793355977422, trigger=click)
2026-04-23T09:57:06.486753Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3593283938725328408, trigger=visual_change)
2026-04-23T09:57:14.384178Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5341343601501307187, trigger=visual_change)
2026-04-23T09:57:32.721765Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5341343601501307187, trigger=visual_change)
2026-04-23T09:59:03.111441Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:59:18.292184Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:59:24.203906Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:59:28.763273Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:59:36.189282Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T10:00:16.817081Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 72 eligible frames
2026-04-23T10:00:21.637421Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 45 frames, 7.5MB → 3.5MB (2.1x), 45 JPEGs deleted
2026-04-23T10:00:24.683587Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.4MB → 1.4MB (3.2x), 25 JPEGs deleted
2026-04-23T10:00:40.573974Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6464745230001326344, trigger=visual_change)
2026-04-23T10:02:52.495992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8171437999531431641, trigger=click)
2026-04-23T10:02:53.374393Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8171437999531431641, trigger=click)
2026-04-23T10:03:37.373391Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-1961095499263201650, trigger=click)
2026-04-23T10:04:58.338820Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T10:05:04.300061Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T10:05:10.114887Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T10:05:16.104422Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T10:05:20.754499Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T10:05:25.933831Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T10:05:30.717296Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=45 elapsed=5.043796209s
2026-04-23T10:05:30.717708Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 45 eligible frames
2026-04-23T10:05:33.129158Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.5MB → 1.3MB (2.8x), 21 JPEGs deleted
2026-04-23T10:05:35.719261Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.9MB → 1.6MB (2.5x), 22 JPEGs deleted
2026-04-23T10:06:54.427408Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T10:06:58.568476Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T10:07:35.294176Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T10:07:36.671700Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T10:07:46.281682Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T10:10:42.001975Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=40 elapsed=6.278440792s
2026-04-23T10:10:42.002064Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 40 eligible frames
2026-04-23T10:10:45.302375Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.7MB → 1.7MB (2.2x), 21 JPEGs deleted
2026-04-23T10:10:47.110830Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.4MB → 0.6MB (7.8x), 17 JPEGs deleted
2026-04-23T10:12:18.002465Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7144568667011834365, trigger=click)
2026-04-23T10:13:16.229637Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3362537224271461493, trigger=visual_change)
2026-04-23T10:13:20.127210Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3362537224271461493, trigger=visual_change)
2026-04-23T10:15:43.498044Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-602531024127880156, trigger=visual_change)
2026-04-23T10:15:46.873827Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-602531024127880156, trigger=visual_change)
2026-04-23T10:15:49.085137Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames
2026-04-23T10:15:49.496235Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-602531024127880156, trigger=visual_change)
2026-04-23T10:15:50.519319Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 3.0MB → 0.9MB (3.3x), 17 JPEGs deleted
2026-04-23T10:15:51.657703Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 3.4MB → 0.5MB (6.7x), 13 JPEGs deleted
2026-04-23T10:15:53.186964Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-602531024127880156, trigger=visual_change)
2026-04-23T10:15:55.743993Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-602531024127880156, trigger=visual_change)
2026-04-23T10:16:10.260016Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7730332891388508974, trigger=visual_change)
2026-04-23T10:16:19.398464Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5862100523266843105, trigger=visual_change)
2026-04-23T10:16:23.686689Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5862100523266843105, trigger=visual_change)
2026-04-23T10:16:27.662719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5862100523266843105, trigger=visual_change)
2026-04-23T10:16:34.159786Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5862100523266843105, trigger=visual_change)
2026-04-23T10:17:00.356336Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5862100523266843105, trigger=visual_change)
2026-04-23T10:17:22.481007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3265723714621232205, trigger=visual_change)
2026-04-23T10:17:29.195939Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3265723714621232205, trigger=visual_change)
2026-04-23T10:17:47.685112Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)
2026-04-23T10:17:51.199158Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)
2026-04-23T10:17:58.199222Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)
2026-04-23T10:18:06.327777Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)
2026-04-23T10:18:13.175283Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)
2026-04-23T10:18:39.739176Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)
2026-04-23T10:19:27.720698Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)
2026-04-23T10:19:31.148096Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)
2026-04-23T10:19:35.991910Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)
2026-04-23T10:19:56.855761Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)
2026-04-23T10:20:03.521058Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)
2026-04-23T10:20:10.069690Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)
2026-04-23T10:20:18.117006Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)
2026-04-23T10:20:54.473088Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=27 elapsed=2.810096209s
2026-04-23T10:20:54.473356Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 27 eligible frames
2026-04-23T10:20:56.920972Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 14 frames, 2.2MB → 0.9MB (2.6x), 14 JPEGs deleted
2026-04-23T10:20:58.678464Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 2.5MB → 0.8MB (3.0x), 11 JPEGs deleted
2026-04-23T10:23:10.727426Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3844820439140861821, trigger=visual_change)
2026-04-23T10:25:16.468416Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T10:25:32.507777Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T10:26:05.910946Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=33 elapsed=7.132200208s
2026-04-23T10:26:05.912569Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 33 eligible frames
2026-04-23T10:26:09.921886Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 3.0MB → 1.2MB (2.5x), 18 JPEGs deleted
2026-04-23T10:26:13.670275Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 2.6MB → 0.9MB (3.0x), 13 JPEGs deleted
2026-04-23T10:26:20.034712Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=click)
2026-04-23T10:26:22.436991Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=click)
2026-04-23T10:26:25.816727Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:27:46.056157Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-1615606372458852745, trigger=click)
2026-04-23T10:28:05.117587Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:28:16.307383Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:28:22.684004Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:28:39.022530Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:28:44.950116Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:28:50.090325Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:28:52.144212Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:28:55.229550Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=click)
2026-04-23T10:28:59.714370Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=click)
2026-04-23T10:29:08.010841Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=click)
2026-04-23T10:29:11.877274Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=click)
2026-04-23T10:29:15.515889Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=click)
2026-04-23T10:29:19.052095Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=click)
2026-04-23T10:29:21.109938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=click)
2026-04-23T10:29:28.551159Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:29:30.947483Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:29:38.350095Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:29:51.477755Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:29:56.846851Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:30:02.584960Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:30:06.779849Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:30:18.311444Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:30:22.665242Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:30:29.333028Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:30:37.983139Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:30:48.829636Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=click)
2026-04-23T10:30:59.474314Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3712905987097609358, trigger=visual_change)
2026-04-23T10:31:16.115641Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=34 elapsed=1.523826083s
2026-04-23T10:31:16.115774Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 34 eligible frames
2026-04-23T10:31:19.674413Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 3.4MB → 2.0MB (1.7x), 19 JPEGs deleted
2026-04-23T10:31:20.281876Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:31:21.222414Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 3.4MB → 0.8MB (4.5x), 13 JPEGs deleted
2026-04-23T10:31:30.589390Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:31:31.649068Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:31:34.542890Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:31:35.913592Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:31:42.222598Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:31:46.314096Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:31:56.457995Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:32:02.440693Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=click)
2026-04-23T10:32:11.844302Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=9, grace=300s)
2026-04-23T10:36:21.778297Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 34 eligible frames
2026-04-23T10:36:23.408803Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 3.2MB → 1.6MB (2.1x), 19 JPEGs deleted
2026-04-23T10:36:24.427188Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 3.4MB → 0.7MB (4.8x), 13 JPEGs deleted
2026-04-23T10:37:15.245266Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Idle (timeout=300s, app=Firefox, id=9)
2026-04-23T10:37:15.499978Z INFO screenpipe_engine::meeting_detector: meeting v2: meeting ended (id=9)
2026-04-23T10:39:08.136849Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7072094695368023128, trigger=visual_change)
2026-04-23T10:40:10.173692Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5626541066854626210, trigger=visual_change)
2026-04-23T10:41:03.187335Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6908211675272154683, trigger=visual_change)
2026-04-23T10:41:27.801144Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=32 elapsed=3.230263875s
2026-04-23T10:41:27.801229Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames
2026-04-23T10:41:30.240257Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 2.7MB → 1.1MB (2.4x), 17 JPEGs deleted
2026-04-23T10:41:31.414104Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 3.3MB → 1.1MB (3.1x), 13 JPEGs deleted
2026-04-23T10:43:59.795473Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=click)
2026-04-23T10:44:00.574274Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)
2026-04-23T10:44:03.353223Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=visual_change)
2026-04-23T10:44:06.333413Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=visual_change)
2026-04-23T10:44:15.554031Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=click)
2026-04-23T10:44:16.272856Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)
2026-04-23T10:44:36.868831Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=visual_change)
2026-04-23T10:44:52.509317Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=visual_change)
2026-04-23T10:45:05.711036Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=visual_change)
2026-04-23T10:45:15.149681Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=click)
2026-04-23T10:45:15.874930Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)
2026-04-23T10:45:18.722067Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)
2026-04-23T10:45:27.888960Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=visual_change)
2026-04-23T10:45:32.102259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)
2026-04-23T10:45:47.964284Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-250182447663358748, trigger=click)
2026-04-23T10:45:57.352178Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-250182447663358748, trigger=click)
2026-04-23T10:45:58.059330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-250182447663358748, trigger=click)
2026-04-23T10:46:00.786122Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-250182447663358748, trigger=click)
2026-04-23T10:46:01.515587Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-250182447663358748, trigger=click)
2026-04-23T10:46:32.335524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 34 eligible frames
2026-04-23T10:46:33.454412Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 15 frames, 1.3MB → 0.3MB (4.3x), 15 JPEGs deleted
2026-04-23T10:46:35.185172Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.4MB → 0.8MB (5.1x), 17 JPEGs deleted
2026-04-23T10:49:51.424053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)
2026-04-23T10:49:52.278022Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=click)
2026-04-23T10:50:06.945403Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=visual_change)
2026-04-23T10:50:20.071306Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)
2026-04-23T10:50:27.322330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)
2026-04-23T10:50:28.025501Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping captur...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"2026-04-23T09:13:09.380863Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-23T09:13:32.742255Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)\n2026-04-23T09:14:01.764079Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4702465002163205464, trigger=click)\n2026-04-23T09:14:04.223149Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4702465002163205464, trigger=visual_change)\n2026-04-23T09:14:06.953796Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=147 elapsed=6.3719465s\n2026-04-23T09:14:06.954006Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 147 eligible frames\n2026-04-23T09:14:12.566935Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 70 frames, 10.3MB → 2.7MB (3.8x), 70 JPEGs deleted\n2026-04-23T09:14:17.358704Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 75 frames, 9.6MB → 3.0MB (3.2x), 75 JPEGs deleted\n2026-04-23T09:15:47.544198Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3660881845293713510, trigger=visual_change)\n2026-04-23T09:15:50.997492Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3660881845293713510, trigger=click)\n2026-04-23T09:15:51.600725Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3660881845293713510, trigger=click)\n2026-04-23T09:15:55.723800Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3660881845293713510, trigger=click)\n2026-04-23T09:15:56.933987Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3660881845293713510, trigger=visual_change)\n2026-04-23T09:15:59.012409Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3660881845293713510, trigger=visual_change)\n2026-04-23T09:16:49.882963Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3759145274440377841, trigger=visual_change)\n2026-04-23T09:16:51.405936Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3759145274440377841, trigger=click)\n2026-04-23T09:16:52.823011Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3759145274440377841, trigger=click)\n2026-04-23T09:16:54.220304Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3759145274440377841, trigger=click)\n2026-04-23T09:16:54.887021Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3759145274440377841, trigger=click)\n2026-04-23T09:16:58.589203Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3759145274440377841, trigger=visual_change)\n2026-04-23T09:18:05.879649Z WARN screenpipe_db::db: wal checkpoint: busy (could not truncate), 5054 pages in WAL\n2026-04-23T09:18:05.879619Z WARN sqlx::query: summary=\"PRAGMA wal_checkpoint(TRUNCATE)\" db.statement=\"\" rows_affected=0 rows_returned=1 elapsed=5.220339167s\n2026-04-23T09:19:24.740122Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=2 elapsed=7.381061833s\n2026-04-23T09:19:24.740850Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 2 eligible frames\n2026-04-23T09:19:36.514406Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2079049776495123607, trigger=click)\n2026-04-23T09:24:26.477446Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=11 elapsed=1.729545666s\n2026-04-23T09:24:26.477540Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 11 eligible frames\n2026-04-23T09:24:27.316363Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 5 frames, 1.4MB → 1.4MB (1.0x), 5 JPEGs deleted\n2026-04-23T09:24:27.966623Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 6 frames, 0.6MB → 0.2MB (2.7x), 6 JPEGs deleted\n2026-04-23T09:24:42.606557Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:26:03.160247Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7786631749263421517, trigger=click)\n2026-04-23T09:27:26.154494Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:27:34.433056Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:28:06.713361Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:28:33.527151Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5209591986308457575, trigger=click)\n2026-04-23T09:28:34.249353Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5209591986308457575, trigger=click)\n2026-04-23T09:28:36.237199Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5209591986308457575, trigger=click)\n2026-04-23T09:28:42.253183Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8747303508868961364, trigger=click)\n2026-04-23T09:28:48.282686Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:28:50.613134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:28:51.314522Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:29:31.961577Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=67 elapsed=3.996031s\n2026-04-23T09:29:31.961670Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 67 eligible frames\n2026-04-23T09:29:34.332658Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 29 frames, 5.8MB → 2.1MB (2.8x), 29 JPEGs deleted\n2026-04-23T09:29:38.223511Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 36 frames, 7.4MB → 3.8MB (2.0x), 36 JPEGs deleted\n2026-04-23T09:30:34.230785Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:30:39.665086Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:30:40.299751Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:30:45.663893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:30:51.622228Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:30:52.321014Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:31:15.021588Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:31:15.691601Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:31:17.946692Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:31:18.653547Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:32:17.960360Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:32:24.051490Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:32:29.442560Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:32:30.131038Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:32:32.452540Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:32:36.585069Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:32:39.322258Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:33:18.072421Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:33:18.766929Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:33:22.098409Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:33:22.782084Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:34:27.313290Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:34:38.542722Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 89 eligible frames\n2026-04-23T09:34:41.684595Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 5.6MB → 0.7MB (7.5x), 38 JPEGs deleted\n2026-04-23T09:34:44.933963Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 49 frames, 10.6MB → 3.8MB (2.8x), 49 JPEGs deleted\n2026-04-23T09:37:57.963204Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:37:58.697604Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:38:02.124214Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:38:53.190171Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:38:59.279885Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:39:02.308536Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:39:36.189861Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:39:49.122120Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=50 elapsed=4.188474542s\n2026-04-23T09:39:49.122232Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 50 eligible frames\n2026-04-23T09:39:51.115025Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 2.9MB → 0.3MB (9.4x), 24 JPEGs deleted\n2026-04-23T09:39:53.096763Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 5.0MB → 2.3MB (2.2x), 24 JPEGs deleted\n2026-04-23T09:40:57.095660Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:40:58.430714Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:41:01.130926Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:41:01.840278Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:41:04.072034Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:41:09.252541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:41:09.972092Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:41:12.313228Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:41:13.696141Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:41:15.723102Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:41:16.452657Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:42:46.382248Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:43:42.993741Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6469703639183038647, trigger=visual_change)\n2026-04-23T09:44:17.245560Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7072623502562616708, trigger=visual_change)\n2026-04-23T09:44:56.342637Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=21 elapsed=2.944921084s\n2026-04-23T09:44:56.343212Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 21 eligible frames\n2026-04-23T09:44:57.216675Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.2MB → 0.2MB (6.9x), 10 JPEGs deleted\n2026-04-23T09:44:58.298212Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 2.1MB → 0.7MB (2.8x), 9 JPEGs deleted\n2026-04-23T09:45:10.982752Z INFO screenpipe_engine::meeting_detector: meeting v2: Idle -> Confirming (app=Firefox, signals=2)\n2026-04-23T09:45:16.376695Z INFO screenpipe_engine::meeting_detector: meeting v2: Confirming -> Active (app=Firefox, signals=2, browser=true)\n2026-04-23T09:45:16.378791Z INFO screenpipe_engine::meeting_detector: meeting v2: meeting started (id=9, app=Firefox, title=None)\n2026-04-23T09:50:01.989691Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=23 elapsed=3.688976042s\n2026-04-23T09:50:01.989962Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 23 eligible frames\n2026-04-23T09:50:03.098505Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 1.3MB → 0.2MB (7.4x), 11 JPEGs deleted\n2026-04-23T09:50:04.627741Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.4MB → 0.8MB (3.1x), 10 JPEGs deleted\n2026-04-23T09:50:07.629323Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4672421675042950776, trigger=click)\n2026-04-23T09:52:11.400798Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:52:15.346773Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:52:18.174934Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:52:22.107623Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:52:32.020499Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:53:33.890239Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:53:35.304629Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:53:58.176084Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:54:14.248454Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:54:18.287472Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:54:20.289467Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:54:24.904239Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:54:27.981243Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:54:29.172367Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:54:30.192245Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:54:31.161165Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:55:11.821088Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=36 elapsed=7.192436875s\n2026-04-23T09:55:11.821248Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 36 eligible frames\n2026-04-23T09:55:13.532739Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 2.3MB → 0.5MB (5.0x), 19 JPEGs deleted\n2026-04-23T09:55:16.625152Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 15 frames, 3.3MB → 1.4MB (2.4x), 15 JPEGs deleted\n2026-04-23T09:56:01.584150Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:56:24.887186Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3078857793355977422, trigger=click)\n2026-04-23T09:56:32.005363Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3078857793355977422, trigger=visual_change)\n2026-04-23T09:56:41.374227Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3078857793355977422, trigger=visual_change)\n2026-04-23T09:56:54.666839Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3078857793355977422, trigger=click)\n2026-04-23T09:57:06.486753Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3593283938725328408, trigger=visual_change)\n2026-04-23T09:57:14.384178Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5341343601501307187, trigger=visual_change)\n2026-04-23T09:57:32.721765Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5341343601501307187, trigger=visual_change)\n2026-04-23T09:59:03.111441Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:59:18.292184Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:59:24.203906Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:59:28.763273Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:59:36.189282Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T10:00:16.817081Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 72 eligible frames\n2026-04-23T10:00:21.637421Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 45 frames, 7.5MB → 3.5MB (2.1x), 45 JPEGs deleted\n2026-04-23T10:00:24.683587Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.4MB → 1.4MB (3.2x), 25 JPEGs deleted\n2026-04-23T10:00:40.573974Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6464745230001326344, trigger=visual_change)\n2026-04-23T10:02:52.495992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8171437999531431641, trigger=click)\n2026-04-23T10:02:53.374393Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8171437999531431641, trigger=click)\n2026-04-23T10:03:37.373391Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-1961095499263201650, trigger=click)\n2026-04-23T10:04:58.338820Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T10:05:04.300061Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T10:05:10.114887Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T10:05:16.104422Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T10:05:20.754499Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T10:05:25.933831Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T10:05:30.717296Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=45 elapsed=5.043796209s\n2026-04-23T10:05:30.717708Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 45 eligible frames\n2026-04-23T10:05:33.129158Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.5MB → 1.3MB (2.8x), 21 JPEGs deleted\n2026-04-23T10:05:35.719261Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.9MB → 1.6MB (2.5x), 22 JPEGs deleted\n2026-04-23T10:06:54.427408Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T10:06:58.568476Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T10:07:35.294176Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T10:07:36.671700Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T10:07:46.281682Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T10:10:42.001975Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=40 elapsed=6.278440792s\n2026-04-23T10:10:42.002064Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 40 eligible frames\n2026-04-23T10:10:45.302375Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.7MB → 1.7MB (2.2x), 21 JPEGs deleted\n2026-04-23T10:10:47.110830Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.4MB → 0.6MB (7.8x), 17 JPEGs deleted\n2026-04-23T10:12:18.002465Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7144568667011834365, trigger=click)\n2026-04-23T10:13:16.229637Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3362537224271461493, trigger=visual_change)\n2026-04-23T10:13:20.127210Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3362537224271461493, trigger=visual_change)\n2026-04-23T10:15:43.498044Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-602531024127880156, trigger=visual_change)\n2026-04-23T10:15:46.873827Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-602531024127880156, trigger=visual_change)\n2026-04-23T10:15:49.085137Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-23T10:15:49.496235Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-602531024127880156, trigger=visual_change)\n2026-04-23T10:15:50.519319Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 3.0MB → 0.9MB (3.3x), 17 JPEGs deleted\n2026-04-23T10:15:51.657703Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 3.4MB → 0.5MB (6.7x), 13 JPEGs deleted\n2026-04-23T10:15:53.186964Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-602531024127880156, trigger=visual_change)\n2026-04-23T10:15:55.743993Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-602531024127880156, trigger=visual_change)\n2026-04-23T10:16:10.260016Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7730332891388508974, trigger=visual_change)\n2026-04-23T10:16:19.398464Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5862100523266843105, trigger=visual_change)\n2026-04-23T10:16:23.686689Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5862100523266843105, trigger=visual_change)\n2026-04-23T10:16:27.662719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5862100523266843105, trigger=visual_change)\n2026-04-23T10:16:34.159786Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5862100523266843105, trigger=visual_change)\n2026-04-23T10:17:00.356336Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5862100523266843105, trigger=visual_change)\n2026-04-23T10:17:22.481007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3265723714621232205, trigger=visual_change)\n2026-04-23T10:17:29.195939Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3265723714621232205, trigger=visual_change)\n2026-04-23T10:17:47.685112Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)\n2026-04-23T10:17:51.199158Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)\n2026-04-23T10:17:58.199222Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)\n2026-04-23T10:18:06.327777Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)\n2026-04-23T10:18:13.175283Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)\n2026-04-23T10:18:39.739176Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)\n2026-04-23T10:19:27.720698Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)\n2026-04-23T10:19:31.148096Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)\n2026-04-23T10:19:35.991910Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)\n2026-04-23T10:19:56.855761Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)\n2026-04-23T10:20:03.521058Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)\n2026-04-23T10:20:10.069690Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)\n2026-04-23T10:20:18.117006Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)\n2026-04-23T10:20:54.473088Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=27 elapsed=2.810096209s\n2026-04-23T10:20:54.473356Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 27 eligible frames\n2026-04-23T10:20:56.920972Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 14 frames, 2.2MB → 0.9MB (2.6x), 14 JPEGs deleted\n2026-04-23T10:20:58.678464Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 2.5MB → 0.8MB (3.0x), 11 JPEGs deleted\n2026-04-23T10:23:10.727426Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3844820439140861821, trigger=visual_change)\n2026-04-23T10:25:16.468416Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T10:25:32.507777Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T10:26:05.910946Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=33 elapsed=7.132200208s\n2026-04-23T10:26:05.912569Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 33 eligible frames\n2026-04-23T10:26:09.921886Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 3.0MB → 1.2MB (2.5x), 18 JPEGs deleted\n2026-04-23T10:26:13.670275Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 2.6MB → 0.9MB (3.0x), 13 JPEGs deleted\n2026-04-23T10:26:20.034712Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=click)\n2026-04-23T10:26:22.436991Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=click)\n2026-04-23T10:26:25.816727Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:27:46.056157Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-1615606372458852745, trigger=click)\n2026-04-23T10:28:05.117587Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:28:16.307383Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:28:22.684004Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:28:39.022530Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:28:44.950116Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:28:50.090325Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:28:52.144212Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:28:55.229550Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=click)\n2026-04-23T10:28:59.714370Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=click)\n2026-04-23T10:29:08.010841Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=click)\n2026-04-23T10:29:11.877274Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=click)\n2026-04-23T10:29:15.515889Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=click)\n2026-04-23T10:29:19.052095Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=click)\n2026-04-23T10:29:21.109938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=click)\n2026-04-23T10:29:28.551159Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:29:30.947483Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:29:38.350095Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:29:51.477755Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:29:56.846851Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:30:02.584960Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:30:06.779849Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:30:18.311444Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:30:22.665242Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:30:29.333028Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:30:37.983139Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:30:48.829636Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=click)\n2026-04-23T10:30:59.474314Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3712905987097609358, trigger=visual_change)\n2026-04-23T10:31:16.115641Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=34 elapsed=1.523826083s\n2026-04-23T10:31:16.115774Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 34 eligible frames\n2026-04-23T10:31:19.674413Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 3.4MB → 2.0MB (1.7x), 19 JPEGs deleted\n2026-04-23T10:31:20.281876Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:31:21.222414Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 3.4MB → 0.8MB (4.5x), 13 JPEGs deleted\n2026-04-23T10:31:30.589390Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:31:31.649068Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:31:34.542890Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:31:35.913592Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:31:42.222598Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:31:46.314096Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:31:56.457995Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:32:02.440693Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=click)\n2026-04-23T10:32:11.844302Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=9, grace=300s)\n2026-04-23T10:36:21.778297Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 34 eligible frames\n2026-04-23T10:36:23.408803Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 3.2MB → 1.6MB (2.1x), 19 JPEGs deleted\n2026-04-23T10:36:24.427188Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 3.4MB → 0.7MB (4.8x), 13 JPEGs deleted\n2026-04-23T10:37:15.245266Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Idle (timeout=300s, app=Firefox, id=9)\n2026-04-23T10:37:15.499978Z INFO screenpipe_engine::meeting_detector: meeting v2: meeting ended (id=9)\n2026-04-23T10:39:08.136849Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7072094695368023128, trigger=visual_change)\n2026-04-23T10:40:10.173692Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5626541066854626210, trigger=visual_change)\n2026-04-23T10:41:03.187335Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6908211675272154683, trigger=visual_change)\n2026-04-23T10:41:27.801144Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=3.230263875s\n2026-04-23T10:41:27.801229Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-23T10:41:30.240257Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 2.7MB → 1.1MB (2.4x), 17 JPEGs deleted\n2026-04-23T10:41:31.414104Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 3.3MB → 1.1MB (3.1x), 13 JPEGs deleted\n2026-04-23T10:43:59.795473Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:44:00.574274Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:44:03.353223Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=visual_change)\n2026-04-23T10:44:06.333413Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=visual_change)\n2026-04-23T10:44:15.554031Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:44:16.272856Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:44:36.868831Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=visual_change)\n2026-04-23T10:44:52.509317Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=visual_change)\n2026-04-23T10:45:05.711036Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=visual_change)\n2026-04-23T10:45:15.149681Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:45:15.874930Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:45:18.722067Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:45:27.888960Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=visual_change)\n2026-04-23T10:45:32.102259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:45:47.964284Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-250182447663358748, trigger=click)\n2026-04-23T10:45:57.352178Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-250182447663358748, trigger=click)\n2026-04-23T10:45:58.059330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-250182447663358748, trigger=click)\n2026-04-23T10:46:00.786122Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-250182447663358748, trigger=click)\n2026-04-23T10:46:01.515587Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-250182447663358748, trigger=click)\n2026-04-23T10:46:32.335524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 34 eligible frames\n2026-04-23T10:46:33.454412Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 15 frames, 1.3MB → 0.3MB (4.3x), 15 JPEGs deleted\n2026-04-23T10:46:35.185172Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.4MB → 0.8MB (5.1x), 17 JPEGs deleted\n2026-04-23T10:49:51.424053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:49:52.278022Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:50:06.945403Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=visual_change)\n2026-04-23T10:50:20.071306Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:50:27.322330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:50:28.025501Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:50:31.361324Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:50:32.067598Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:50:43.957181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:50:49.116814Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:50:49.902205Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:50:52.787071Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:50:55.600444Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:50:56.613411Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:51:01.606653Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=visual_change)\n2026-04-23T10:51:36.294219Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 21 eligible frames\n2026-04-23T10:51:37.139478Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 0.9MB → 0.1MB (8.1x), 10 JPEGs deleted\n2026-04-23T10:51:37.977586Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 2.4MB → 0.4MB (5.6x), 9 JPEGs deleted\n2026-04-23T10:53:10.914762Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5094416737894467752, trigger=click)\n2026-04-23T10:53:46.764312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5492569374489755072, trigger=click)\n2026-04-23T10:53:47.493963Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5492569374489755072, trigger=click)\n2026-04-23T10:55:50.508246Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9185031867676948653, trigger=click)\n2026-04-23T10:56:18.190631Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8265869039182172474, trigger=visual_change)\n2026-04-23T10:56:21.391253Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8265869039182172474, trigger=visual_change)\n2026-04-23T10:56:44.441379Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=33 elapsed=6.451315834s\n2026-04-23T10:56:44.441894Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 33 eligible frames\n2026-04-23T10:56:46.435494Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 1.6MB → 0.1MB (14.8x), 17 JPEGs deleted\n2026-04-23T10:56:47.618773Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 14 frames, 3.5MB → 1.0MB (3.6x), 14 JPEGs deleted\n2026-04-23T10:56:48.429385Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3009288458992913716, trigger=visual_change)\n2026-04-23T10:56:55.377427Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3009288458992913716, trigger=visual_change)\n2026-04-23T10:56:58.331194Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3009288458992913716, trigger=visual_change)\n2026-04-23T10:57:31.580363Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=164293696523982731, trigger=visual_change)\n2026-04-23T10:57:37.142409Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=164293696523982731, trigger=visual_change)\n2026-04-23T11:01:54.879662Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=43 elapsed=6.651773875s\n2026-04-23T11:01:54.879780Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 43 eligible frames\n2026-04-23T11:01:56.181324Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 20 frames, 2.1MB → 0.5MB (4.0x), 20 JPEGs deleted\n2026-04-23T11:01:57.821885Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.6MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-23T11:05:34.805879Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4133405882569027308, trigger=click)\n2026-04-23T11:05:42.692507Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-792819002159032212, trigger=click)\n2026-04-23T11:05:45.195836Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-792819002159032212, trigger=click)\n2026-04-23T11:06:58.003581Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 56 eligible frames\n2026-04-23T11:07:01.998524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 4.2MB → 2.0MB (2.1x), 27 JPEGs deleted\n2026-04-23T11:07:04.632834Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 6.1MB → 1.2MB (5.2x), 27 JPEGs deleted\n2026-04-23T11:08:29.041425Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=811120582590877593, trigger=click)\n2026-04-23T11:11:26.078346Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=811120582590877593, trigger=click)\n2026-04-23T11:11:26.826746Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=811120582590877593, trigger=click)\n2026-04-23T11:11:29.736291Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=811120582590877593, trigger=click)\n2026-04-23T11:11:30.502898Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=811120582590877593, trigger=click)\n2026-04-23T11:11:33.284639Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=811120582590877593, trigger=click)\n2026-04-23T11:11:34.732219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=811120582590877593, trigger=click)\n2026-04-23T11:11:36.846175Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=811120582590877593, trigger=click)\n2026-04-23T11:11:47.161668Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=811120582590877593, trigger=visual_change)\n2026-04-23T11:11:51.463126Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=811120582590877593, trigger=click)\n2026-04-23T11:11:55.190182Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=811120582590877593, trigger=click)\n2026-04-23T11:11:58.250612Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=811120582590877593, trigger=click)\n2026-04-23T11:11:58.984195Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=811120582590877593, trigger=click)\n2026-04-23T11:12:07.186907Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8190951420737299430, trigger=visual_change)\n2026-04-23T11:12:10.805150Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=28 elapsed=6.153365375s\n2026-04-23T11:12:10.806451Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 28 eligible frames\n2026-04-23T11:12:12.869531Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 16 frames, 2.7MB → 1.2MB (2.2x), 16 JPEGs deleted\n2026-04-23T11:12:14.462884Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB (5.9x), 10 JPEGs deleted\n2026-04-23T11:14:59.283313Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-962688942467523245, trigger=click)\n2026-04-23T11:14:59.996111Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-962688942467523245, trigger=click)\n2026-04-23T11:15:52.562512Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4085483410823602662, trigger=click)\n2026-04-23T11:16:10.556556Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-680298114769977367, trigger=click)\n2026-04-23T11:16:44.987984Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-781142721963066587, trigger=click)\n2026-04-23T11:17:15.717626Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=34 elapsed=1.192290209s\n2026-04-23T11:17:15.717877Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 34 eligible frames\n2026-04-23T11:17:16.801524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 14 frames, 1.7MB → 0.3MB (6.4x), 14 JPEGs deleted\n2026-04-23T11:17:18.950114Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 4.0MB → 0.9MB (4.3x), 18 JPEGs deleted\n2026-04-23T11:22:21.353046Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=27 elapsed=2.391216916s\n2026-04-23T11:22:21.353161Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 27 eligible frames\n2026-04-23T11:22:22.204810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.6MB → 0.2MB (7.8x), 13 JPEGs deleted\n2026-04-23T11:22:23.352237Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 12 frames, 2.7MB → 1.1MB (2.5x), 12 JPEGs deleted\n2026-04-23T11:22:51.641783Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5591071779487381740, trigger=visual_change)\n2026-04-23T11:24:42.126313Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3622496340535697523, trigger=click)\n2026-04-23T11:27:16.328827Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3622496340535697523, trigger=click)\n2026-04-23T11:27:17.062717Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3622496340535697523, trigger=click)\n2026-04-23T11:27:20.131333Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3622496340535697523, trigger=visual_change)\n2026-04-23T11:27:27.263965Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=2.915186083s\n2026-04-23T11:27:27.264345Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-23T11:27:29.317049Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 16 frames, 2.1MB → 0.6MB (3.5x), 16 JPEGs deleted\n2026-04-23T11:27:31.637712Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 14 frames, 3.0MB → 0.8MB (3.8x), 14 JPEGs deleted\n2026-04-23T11:29:03.406489Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1491366973306919482, trigger=visual_change)\n2026-04-23T11:29:37.371120Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-1491366973306919482, trigger=click)\n2026-04-23T11:29:38.828999Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1491366973306919482, trigger=click)\n2026-04-23T11:30:05.594417Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7420299184765789117, trigger=click)\n2026-04-23T11:30:10.415695Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7420299184765789117, trigger=click)\n2026-04-23T11:30:37.438406Z INFO screenpipe_engine::meeting_detector: meeting v2: Idle -> Confirming (app=Firefox, signals=2)\n2026-04-23T11:30:47.134756Z INFO screenpipe_engine::meeting_detector: meeting v2: Confirming -> Active (app=Firefox, signals=2, browser=true)\n2026-04-23T11:30:47.150842Z INFO screenpipe_engine::meeting_detector: meeting v2: meeting started (id=10, app=Firefox, title=None)\n2026-04-23T11:32:52.795697Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=click, monitor=1) — DB pool may be saturated\n2026-04-23T11:32:54.063047Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=22.405129875s\n2026-04-23T11:32:54.065127Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-23T11:32:56.659956Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.7MB → 0.3MB (5.8x), 10 JPEGs deleted\n2026-04-23T11:32:58.390326Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.1MB → 0.4MB (5.1x), 10 JPEGs deleted\n2026-04-23T11:32:58.454323Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=click, monitor=2) — DB pool may be saturated\n2026-04-23T11:33:03.630685Z INFO screenpipe_engine::event_driven_capture: monitor 2 capture recovered after 1 consecutive errors\n2026-04-23T11:33:03.698376Z INFO screenpipe_engine::event_driven_capture: monitor 1 capture recovered after 1 consecutive errors\n2026-04-23T11:34:08.146813Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=visual_change, monitor=1) — DB pool may be saturated\n2026-04-23T11:34:19.115606Z INFO screenpipe_engine::event_driven_capture: monitor 1 capture recovered after 1 consecutive errors\n2026-04-23T11:38:06.413998Z WARN sqlx::query: summary=\"PRAGMA wal_checkpoint(TRUNCATE)\" db.statement=\"\" rows_affected=0 rows_returned=1 elapsed=5.320189792s\n2026-04-23T11:38:06.417026Z WARN screenpipe_db::db: wal checkpoint: busy (could not truncate), 1136 pages in WAL\n2026-04-23T11:38:06.480369Z WARN sqlx::query: summary=\"BEGIN IMMEDIATE\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=3.645234084s\n2026-04-23T11:38:12.229580Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=26 elapsed=13.80812125s\n2026-04-23T11:38:12.232573Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 26 eligible frames\n2026-04-23T11:38:15.382662Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 1.9MB → 0.5MB (3.8x), 11 JPEGs deleted\n2026-04-23T11:38:16.795794Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=visual_change, monitor=1) — DB pool may be saturated\n2026-04-23T11:38:19.817599Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 2.7MB → 0.6MB (4.2x), 13 JPEGs deleted\n2026-04-23T11:38:24.993308Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=visual_change, monitor=2) — DB pool may be saturated\n2026-04-23T11:38:30.141938Z INFO screenpipe_engine::event_driven_capture: monitor 1 capture recovered after 1 consecutive errors\n2026-04-23T11:38:34.776814Z INFO screenpipe_engine::event_driven_capture: monitor 2 capture recovered after 1 consecutive errors\n2026-04-23T11:40:55.703155Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5781407336396073109, trigger=visual_change)\n2026-04-23T11:41:02.662314Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5781407336396073109, trigger=visual_change)\n2026-04-23T11:41:09.390136Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5781407336396073109, trigger=visual_change)\n2026-04-23T11:41:16.161715Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5781407336396073109, trigger=visual_change)\n2026-04-23T11:41:37.205648Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5781407336396073109, trigger=visual_change)\n2026-04-23T11:42:04.257036Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5781407336396073109, trigger=visual_change)\n2026-04-23T11:42:21.214633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6679997250984875896, trigger=visual_change)\n2026-04-23T11:42:24.525053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6679997250984875896, trigger=visual_change)\n2026-04-23T11:42:29.877589Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6679997250984875896, trigger=visual_change)\n2026-04-23T11:42:33.802238Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6679997250984875896, trigger=visual_change)\n2026-04-23T11:42:36.923509Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6679997250984875896, trigger=visual_change)\n2026-04-23T11:42:57.455576Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6679997250984875896, trigger=visual_change)\n2026-04-23T11:43:12.031547Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=951548071599591969, trigger=visual_change)\n2026-04-23T11:43:18.874182Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=951548071599591969, trigger=visual_change)\n2026-04-23T11:43:24.247849Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=951548071599591969, trigger=visual_change)\n2026-04-23T11:43:26.259182Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=49 elapsed=6.405864s\n2026-04-23T11:43:26.263056Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 49 eligible frames\n2026-04-23T11:43:32.316690Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 23 frames, 3.7MB → 1.8MB (2.0x), 23 JPEGs deleted\n2026-04-23T11:43:34.974978Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=951548071599591969, trigger=visual_change)\n2026-04-23T11:43:36.047883Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 4.3MB → 1.5MB (2.9x), 24 JPEGs deleted\n2026-04-23T11:43:49.116309Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=951548071599591969, trigger=visual_change)\n2026-04-23T11:43:52.940018Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=951548071599591969, trigger=visual_change)\n2026-04-23T11:43:56.539135Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=951548071599591969, trigger=visual_change)\n2026-04-23T11:44:11.233290Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4079677798565982376, trigger=visual_change)\n2026-04-23T11:45:03.923694Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=click, monitor=2) — DB pool may be saturated\n2026-04-23T11:45:18.638512Z INFO screenpipe_engine::event_driven_capture: monitor 2 capture recovered after 1 consecutive errors\n2026-04-23T11:45:27.824824Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=click, monitor=1) — DB pool may be saturated\n2026-04-23T11:45:41.576372Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=click, monitor=2) — DB pool may be saturated\n2026-04-23T11:45:44.291896Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=click, monitor=1) — DB pool may be saturated\n2026-04-23T11:46:03.257280Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=click, monitor=1) — DB pool may be saturated\n2026-04-23T11:46:12.724398Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=visual_change, monitor=2) — DB pool may be saturated\n2026-04-23T11:46:22.727197Z INFO screenpipe_engine::event_driven_capture: monitor 1 capture recovered after 3 consecutive errors\n2026-04-23T11:46:24.228006Z INFO screenpipe_engine::event_driven_capture: monitor 2 capture recovered after 2 consecutive errors\n2026-04-23T11:46:40.390580Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7643951286516936585, trigger=visual_change)\n2026-04-23T11:46:49.248747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7643951286516936585, trigger=visual_change)\n2026-04-23T11:46:55.471031Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7643951286516936585, trigger=visual_change)\n2026-04-23T11:47:02.336575Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7643951286516936585, trigger=visual_change)\n2026-04-23T11:48:17.252755Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7643951286516936585, trigger=visual_change)\n2026-04-23T11:48:25.013997Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7643951286516936585, trigger=visual_change)\n2026-04-23T11:48:53.059242Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=56 elapsed=13.220216708s\n2026-04-23T11:48:53.065643Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 56 eligible frames\n2026-04-23T11:48:58.527594Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 30 frames, 4.7MB → 2.2MB (2.1x), 30 JPEGs deleted\n2026-04-23T11:49:05.857012Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 4.3MB → 1.6MB (2.7x), 24 JPEGs deleted\n2026-04-23T11:49:06.658338Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5995459936453258264, trigger=visual_change)\n2026-04-23T11:49:28.247468Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5995459936453258264, trigger=visual_change)\n2026-04-23T11:49:46.108336Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4001297392414942723, trigger=visual_change)\n2026-04-23T11:49:53.084297Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4001297392414942723, trigger=visual_change)\n2026-04-23T11:49:56.028797Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4001297392414942723, trigger=click)\n2026-04-23T11:50:37.287127Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2527600923706712259, trigger=visual_change)\n2026-04-23T11:51:12.946650Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1489108089542937642, trigger=visual_change)\n2026-04-23T11:51:19.338386Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1489108089542937642, trigger=visual_change)\n2026-04-23T11:52:16.352383Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8163356110886780433, trigger=visual_change)\n2026-04-23T11:53:55.890568Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5293025605401136867, trigger=click)\n2026-04-23T11:54:09.640558Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=41 elapsed=3.460436583s\n2026-04-23T11:54:09.640693Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 41 eligible frames\n2026-04-23T11:54:13.152878Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.3MB → 1.5MB (2.2x), 22 JPEGs deleted\n2026-04-23T11:54:15.204535Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 3.9MB → 1.2MB (3.4x), 17 JPEGs deleted\n2026-04-23T11:58:11.876342Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=10, grace=300s)\n2026-04-23T11:59:15.385310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 25 eligible frames\n2026-04-23T11:59:16.921656Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.6MB → 0.6MB (2.8x), 13 JPEGs deleted\n2026-04-23T11:59:18.047335Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.2MB → 1.0MB (2.3x), 10 JPEGs deleted\n2026-04-23T12:01:17.114786Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7823854956395915880, trigger=click)\n/Volumes/Work/2026/User\\ Pilot\\ introduction\\ Adi\\ 2026-04-23.mp4 2026-04-23T12:02:09.213929Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4997183725580178172, trigger=visual_change)\n2026-04-23T12:02:12.305485Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4997183725580178172, trigger=visual_change)\n2026-04-23T12:02:22.392607Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4428370940474457947, trigger=visual_change)\n2026-04-23T12:02:23.534043Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4428370940474457947, trigger=click)\n2026-04-23T12:02:25.338561Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4428370940474457947, trigger=click)\n2026-04-23T12:02:26.896633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4428370940474457947, trigger=click)\n2026-04-23T12:03:14.422791Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Idle (timeout=300s, app=Firefox, id=10)\n2026-04-23T12:03:14.697666Z INFO screenpipe_engine::meeting_detector: meeting v2: meeting ended (id=10)\n2026-04-23T12:04:18.652471Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 62 eligible frames\n2026-04-23T12:04:22.291047Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 36 frames, 4.6MB → 1.6MB (3.0x), 36 JPEGs deleted\n2026-04-23T12:04:25.831665Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 4.8MB → 1.1MB (4.3x), 24 JPEGs deleted\n2026-04-23T12:04:36.186162Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8094579906910625439, trigger=click)","depth":4,"value":"2026-04-23T09:13:09.380863Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2\n2026-04-23T09:13:32.742255Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)\n2026-04-23T09:14:01.764079Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4702465002163205464, trigger=click)\n2026-04-23T09:14:04.223149Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4702465002163205464, trigger=visual_change)\n2026-04-23T09:14:06.953796Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=147 elapsed=6.3719465s\n2026-04-23T09:14:06.954006Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 147 eligible frames\n2026-04-23T09:14:12.566935Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 70 frames, 10.3MB → 2.7MB (3.8x), 70 JPEGs deleted\n2026-04-23T09:14:17.358704Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 75 frames, 9.6MB → 3.0MB (3.2x), 75 JPEGs deleted\n2026-04-23T09:15:47.544198Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3660881845293713510, trigger=visual_change)\n2026-04-23T09:15:50.997492Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3660881845293713510, trigger=click)\n2026-04-23T09:15:51.600725Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3660881845293713510, trigger=click)\n2026-04-23T09:15:55.723800Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3660881845293713510, trigger=click)\n2026-04-23T09:15:56.933987Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3660881845293713510, trigger=visual_change)\n2026-04-23T09:15:59.012409Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3660881845293713510, trigger=visual_change)\n2026-04-23T09:16:49.882963Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3759145274440377841, trigger=visual_change)\n2026-04-23T09:16:51.405936Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3759145274440377841, trigger=click)\n2026-04-23T09:16:52.823011Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3759145274440377841, trigger=click)\n2026-04-23T09:16:54.220304Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3759145274440377841, trigger=click)\n2026-04-23T09:16:54.887021Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3759145274440377841, trigger=click)\n2026-04-23T09:16:58.589203Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3759145274440377841, trigger=visual_change)\n2026-04-23T09:18:05.879649Z WARN screenpipe_db::db: wal checkpoint: busy (could not truncate), 5054 pages in WAL\n2026-04-23T09:18:05.879619Z WARN sqlx::query: summary=\"PRAGMA wal_checkpoint(TRUNCATE)\" db.statement=\"\" rows_affected=0 rows_returned=1 elapsed=5.220339167s\n2026-04-23T09:19:24.740122Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=2 elapsed=7.381061833s\n2026-04-23T09:19:24.740850Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 2 eligible frames\n2026-04-23T09:19:36.514406Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2079049776495123607, trigger=click)\n2026-04-23T09:24:26.477446Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=11 elapsed=1.729545666s\n2026-04-23T09:24:26.477540Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 11 eligible frames\n2026-04-23T09:24:27.316363Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 5 frames, 1.4MB → 1.4MB (1.0x), 5 JPEGs deleted\n2026-04-23T09:24:27.966623Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 6 frames, 0.6MB → 0.2MB (2.7x), 6 JPEGs deleted\n2026-04-23T09:24:42.606557Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:26:03.160247Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7786631749263421517, trigger=click)\n2026-04-23T09:27:26.154494Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:27:34.433056Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:28:06.713361Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:28:33.527151Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5209591986308457575, trigger=click)\n2026-04-23T09:28:34.249353Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5209591986308457575, trigger=click)\n2026-04-23T09:28:36.237199Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5209591986308457575, trigger=click)\n2026-04-23T09:28:42.253183Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8747303508868961364, trigger=click)\n2026-04-23T09:28:48.282686Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:28:50.613134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:28:51.314522Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:29:31.961577Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=67 elapsed=3.996031s\n2026-04-23T09:29:31.961670Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 67 eligible frames\n2026-04-23T09:29:34.332658Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 29 frames, 5.8MB → 2.1MB (2.8x), 29 JPEGs deleted\n2026-04-23T09:29:38.223511Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 36 frames, 7.4MB → 3.8MB (2.0x), 36 JPEGs deleted\n2026-04-23T09:30:34.230785Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:30:39.665086Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:30:40.299751Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:30:45.663893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:30:51.622228Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:30:52.321014Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:31:15.021588Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:31:15.691601Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:31:17.946692Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:31:18.653547Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:32:17.960360Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:32:24.051490Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:32:29.442560Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:32:30.131038Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:32:32.452540Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:32:36.585069Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:32:39.322258Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:33:18.072421Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:33:18.766929Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:33:22.098409Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:33:22.782084Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:34:27.313290Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:34:38.542722Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 89 eligible frames\n2026-04-23T09:34:41.684595Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 5.6MB → 0.7MB (7.5x), 38 JPEGs deleted\n2026-04-23T09:34:44.933963Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 49 frames, 10.6MB → 3.8MB (2.8x), 49 JPEGs deleted\n2026-04-23T09:37:57.963204Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:37:58.697604Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:38:02.124214Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:38:53.190171Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:38:59.279885Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:39:02.308536Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:39:36.189861Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:39:49.122120Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=50 elapsed=4.188474542s\n2026-04-23T09:39:49.122232Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 50 eligible frames\n2026-04-23T09:39:51.115025Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 2.9MB → 0.3MB (9.4x), 24 JPEGs deleted\n2026-04-23T09:39:53.096763Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 5.0MB → 2.3MB (2.2x), 24 JPEGs deleted\n2026-04-23T09:40:57.095660Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:40:58.430714Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:41:01.130926Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:41:01.840278Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:41:04.072034Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:41:09.252541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:41:09.972092Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:41:12.313228Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:41:13.696141Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:41:15.723102Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:41:16.452657Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:42:46.382248Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:43:42.993741Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6469703639183038647, trigger=visual_change)\n2026-04-23T09:44:17.245560Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7072623502562616708, trigger=visual_change)\n2026-04-23T09:44:56.342637Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=21 elapsed=2.944921084s\n2026-04-23T09:44:56.343212Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 21 eligible frames\n2026-04-23T09:44:57.216675Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.2MB → 0.2MB (6.9x), 10 JPEGs deleted\n2026-04-23T09:44:58.298212Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 2.1MB → 0.7MB (2.8x), 9 JPEGs deleted\n2026-04-23T09:45:10.982752Z INFO screenpipe_engine::meeting_detector: meeting v2: Idle -> Confirming (app=Firefox, signals=2)\n2026-04-23T09:45:16.376695Z INFO screenpipe_engine::meeting_detector: meeting v2: Confirming -> Active (app=Firefox, signals=2, browser=true)\n2026-04-23T09:45:16.378791Z INFO screenpipe_engine::meeting_detector: meeting v2: meeting started (id=9, app=Firefox, title=None)\n2026-04-23T09:50:01.989691Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=23 elapsed=3.688976042s\n2026-04-23T09:50:01.989962Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 23 eligible frames\n2026-04-23T09:50:03.098505Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 1.3MB → 0.2MB (7.4x), 11 JPEGs deleted\n2026-04-23T09:50:04.627741Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.4MB → 0.8MB (3.1x), 10 JPEGs deleted\n2026-04-23T09:50:07.629323Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4672421675042950776, trigger=click)\n2026-04-23T09:52:11.400798Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:52:15.346773Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:52:18.174934Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:52:22.107623Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:52:32.020499Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:53:33.890239Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:53:35.304629Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:53:58.176084Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:54:14.248454Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:54:18.287472Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:54:20.289467Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:54:24.904239Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:54:27.981243Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:54:29.172367Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:54:30.192245Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:54:31.161165Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:55:11.821088Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=36 elapsed=7.192436875s\n2026-04-23T09:55:11.821248Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 36 eligible frames\n2026-04-23T09:55:13.532739Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 2.3MB → 0.5MB (5.0x), 19 JPEGs deleted\n2026-04-23T09:55:16.625152Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 15 frames, 3.3MB → 1.4MB (2.4x), 15 JPEGs deleted\n2026-04-23T09:56:01.584150Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:56:24.887186Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3078857793355977422, trigger=click)\n2026-04-23T09:56:32.005363Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3078857793355977422, trigger=visual_change)\n2026-04-23T09:56:41.374227Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3078857793355977422, trigger=visual_change)\n2026-04-23T09:56:54.666839Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3078857793355977422, trigger=click)\n2026-04-23T09:57:06.486753Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3593283938725328408, trigger=visual_change)\n2026-04-23T09:57:14.384178Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5341343601501307187, trigger=visual_change)\n2026-04-23T09:57:32.721765Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5341343601501307187, trigger=visual_change)\n2026-04-23T09:59:03.111441Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T09:59:18.292184Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:59:24.203906Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:59:28.763273Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T09:59:36.189282Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T10:00:16.817081Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 72 eligible frames\n2026-04-23T10:00:21.637421Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 45 frames, 7.5MB → 3.5MB (2.1x), 45 JPEGs deleted\n2026-04-23T10:00:24.683587Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.4MB → 1.4MB (3.2x), 25 JPEGs deleted\n2026-04-23T10:00:40.573974Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6464745230001326344, trigger=visual_change)\n2026-04-23T10:02:52.495992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8171437999531431641, trigger=click)\n2026-04-23T10:02:53.374393Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8171437999531431641, trigger=click)\n2026-04-23T10:03:37.373391Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-1961095499263201650, trigger=click)\n2026-04-23T10:04:58.338820Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T10:05:04.300061Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T10:05:10.114887Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T10:05:16.104422Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T10:05:20.754499Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T10:05:25.933831Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T10:05:30.717296Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=45 elapsed=5.043796209s\n2026-04-23T10:05:30.717708Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 45 eligible frames\n2026-04-23T10:05:33.129158Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.5MB → 1.3MB (2.8x), 21 JPEGs deleted\n2026-04-23T10:05:35.719261Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.9MB → 1.6MB (2.5x), 22 JPEGs deleted\n2026-04-23T10:06:54.427408Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T10:06:58.568476Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T10:07:35.294176Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T10:07:36.671700Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)\n2026-04-23T10:07:46.281682Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)\n2026-04-23T10:10:42.001975Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=40 elapsed=6.278440792s\n2026-04-23T10:10:42.002064Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 40 eligible frames\n2026-04-23T10:10:45.302375Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.7MB → 1.7MB (2.2x), 21 JPEGs deleted\n2026-04-23T10:10:47.110830Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.4MB → 0.6MB (7.8x), 17 JPEGs deleted\n2026-04-23T10:12:18.002465Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7144568667011834365, trigger=click)\n2026-04-23T10:13:16.229637Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3362537224271461493, trigger=visual_change)\n2026-04-23T10:13:20.127210Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3362537224271461493, trigger=visual_change)\n2026-04-23T10:15:43.498044Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-602531024127880156, trigger=visual_change)\n2026-04-23T10:15:46.873827Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-602531024127880156, trigger=visual_change)\n2026-04-23T10:15:49.085137Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-23T10:15:49.496235Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-602531024127880156, trigger=visual_change)\n2026-04-23T10:15:50.519319Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 3.0MB → 0.9MB (3.3x), 17 JPEGs deleted\n2026-04-23T10:15:51.657703Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 3.4MB → 0.5MB (6.7x), 13 JPEGs deleted\n2026-04-23T10:15:53.186964Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-602531024127880156, trigger=visual_change)\n2026-04-23T10:15:55.743993Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-602531024127880156, trigger=visual_change)\n2026-04-23T10:16:10.260016Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7730332891388508974, trigger=visual_change)\n2026-04-23T10:16:19.398464Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5862100523266843105, trigger=visual_change)\n2026-04-23T10:16:23.686689Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5862100523266843105, trigger=visual_change)\n2026-04-23T10:16:27.662719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5862100523266843105, trigger=visual_change)\n2026-04-23T10:16:34.159786Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5862100523266843105, trigger=visual_change)\n2026-04-23T10:17:00.356336Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5862100523266843105, trigger=visual_change)\n2026-04-23T10:17:22.481007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3265723714621232205, trigger=visual_change)\n2026-04-23T10:17:29.195939Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3265723714621232205, trigger=visual_change)\n2026-04-23T10:17:47.685112Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)\n2026-04-23T10:17:51.199158Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)\n2026-04-23T10:17:58.199222Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)\n2026-04-23T10:18:06.327777Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)\n2026-04-23T10:18:13.175283Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)\n2026-04-23T10:18:39.739176Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)\n2026-04-23T10:19:27.720698Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)\n2026-04-23T10:19:31.148096Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)\n2026-04-23T10:19:35.991910Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)\n2026-04-23T10:19:56.855761Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)\n2026-04-23T10:20:03.521058Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)\n2026-04-23T10:20:10.069690Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)\n2026-04-23T10:20:18.117006Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)\n2026-04-23T10:20:54.473088Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=27 elapsed=2.810096209s\n2026-04-23T10:20:54.473356Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 27 eligible frames\n2026-04-23T10:20:56.920972Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 14 frames, 2.2MB → 0.9MB (2.6x), 14 JPEGs deleted\n2026-04-23T10:20:58.678464Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 2.5MB → 0.8MB (3.0x), 11 JPEGs deleted\n2026-04-23T10:23:10.727426Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3844820439140861821, trigger=visual_change)\n2026-04-23T10:25:16.468416Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T10:25:32.507777Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)\n2026-04-23T10:26:05.910946Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=33 elapsed=7.132200208s\n2026-04-23T10:26:05.912569Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 33 eligible frames\n2026-04-23T10:26:09.921886Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 3.0MB → 1.2MB (2.5x), 18 JPEGs deleted\n2026-04-23T10:26:13.670275Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 2.6MB → 0.9MB (3.0x), 13 JPEGs deleted\n2026-04-23T10:26:20.034712Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=click)\n2026-04-23T10:26:22.436991Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=click)\n2026-04-23T10:26:25.816727Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:27:46.056157Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-1615606372458852745, trigger=click)\n2026-04-23T10:28:05.117587Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:28:16.307383Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:28:22.684004Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:28:39.022530Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:28:44.950116Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:28:50.090325Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:28:52.144212Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:28:55.229550Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=click)\n2026-04-23T10:28:59.714370Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=click)\n2026-04-23T10:29:08.010841Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=click)\n2026-04-23T10:29:11.877274Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=click)\n2026-04-23T10:29:15.515889Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=click)\n2026-04-23T10:29:19.052095Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=click)\n2026-04-23T10:29:21.109938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=click)\n2026-04-23T10:29:28.551159Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:29:30.947483Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:29:38.350095Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:29:51.477755Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:29:56.846851Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:30:02.584960Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:30:06.779849Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:30:18.311444Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:30:22.665242Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:30:29.333028Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:30:37.983139Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:30:48.829636Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=click)\n2026-04-23T10:30:59.474314Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3712905987097609358, trigger=visual_change)\n2026-04-23T10:31:16.115641Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=34 elapsed=1.523826083s\n2026-04-23T10:31:16.115774Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 34 eligible frames\n2026-04-23T10:31:19.674413Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 3.4MB → 2.0MB (1.7x), 19 JPEGs deleted\n2026-04-23T10:31:20.281876Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:31:21.222414Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 3.4MB → 0.8MB (4.5x), 13 JPEGs deleted\n2026-04-23T10:31:30.589390Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:31:31.649068Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:31:34.542890Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:31:35.913592Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:31:42.222598Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:31:46.314096Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:31:56.457995Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)\n2026-04-23T10:32:02.440693Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=click)\n2026-04-23T10:32:11.844302Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=9, grace=300s)\n2026-04-23T10:36:21.778297Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 34 eligible frames\n2026-04-23T10:36:23.408803Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 3.2MB → 1.6MB (2.1x), 19 JPEGs deleted\n2026-04-23T10:36:24.427188Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 3.4MB → 0.7MB (4.8x), 13 JPEGs deleted\n2026-04-23T10:37:15.245266Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Idle (timeout=300s, app=Firefox, id=9)\n2026-04-23T10:37:15.499978Z INFO screenpipe_engine::meeting_detector: meeting v2: meeting ended (id=9)\n2026-04-23T10:39:08.136849Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7072094695368023128, trigger=visual_change)\n2026-04-23T10:40:10.173692Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5626541066854626210, trigger=visual_change)\n2026-04-23T10:41:03.187335Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6908211675272154683, trigger=visual_change)\n2026-04-23T10:41:27.801144Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=3.230263875s\n2026-04-23T10:41:27.801229Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-23T10:41:30.240257Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 2.7MB → 1.1MB (2.4x), 17 JPEGs deleted\n2026-04-23T10:41:31.414104Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 3.3MB → 1.1MB (3.1x), 13 JPEGs deleted\n2026-04-23T10:43:59.795473Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:44:00.574274Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:44:03.353223Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=visual_change)\n2026-04-23T10:44:06.333413Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=visual_change)\n2026-04-23T10:44:15.554031Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:44:16.272856Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:44:36.868831Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=visual_change)\n2026-04-23T10:44:52.509317Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=visual_change)\n2026-04-23T10:45:05.711036Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=visual_change)\n2026-04-23T10:45:15.149681Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:45:15.874930Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:45:18.722067Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:45:27.888960Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=visual_change)\n2026-04-23T10:45:32.102259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:45:47.964284Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-250182447663358748, trigger=click)\n2026-04-23T10:45:57.352178Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-250182447663358748, trigger=click)\n2026-04-23T10:45:58.059330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-250182447663358748, trigger=click)\n2026-04-23T10:46:00.786122Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-250182447663358748, trigger=click)\n2026-04-23T10:46:01.515587Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-250182447663358748, trigger=click)\n2026-04-23T10:46:32.335524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 34 eligible frames\n2026-04-23T10:46:33.454412Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 15 frames, 1.3MB → 0.3MB (4.3x), 15 JPEGs deleted\n2026-04-23T10:46:35.185172Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.4MB → 0.8MB (5.1x), 17 JPEGs deleted\n2026-04-23T10:49:51.424053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:49:52.278022Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:50:06.945403Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=visual_change)\n2026-04-23T10:50:20.071306Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:50:27.322330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:50:28.025501Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:50:31.361324Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:50:32.067598Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:50:43.957181Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:50:49.116814Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:50:49.902205Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:50:52.787071Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:50:55.600444Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:50:56.613411Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=click)\n2026-04-23T10:51:01.606653Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=visual_change)\n2026-04-23T10:51:36.294219Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 21 eligible frames\n2026-04-23T10:51:37.139478Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 0.9MB → 0.1MB (8.1x), 10 JPEGs deleted\n2026-04-23T10:51:37.977586Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 2.4MB → 0.4MB (5.6x), 9 JPEGs deleted\n2026-04-23T10:53:10.914762Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5094416737894467752, trigger=click)\n2026-04-23T10:53:46.764312Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-5492569374489755072, trigger=click)\n2026-04-23T10:53:47.493963Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5492569374489755072, trigger=click)\n2026-04-23T10:55:50.508246Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-9185031867676948653, trigger=click)\n2026-04-23T10:56:18.190631Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8265869039182172474, trigger=visual_change)\n2026-04-23T10:56:21.391253Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8265869039182172474, trigger=visual_change)\n2026-04-23T10:56:44.441379Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=33 elapsed=6.451315834s\n2026-04-23T10:56:44.441894Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 33 eligible frames\n2026-04-23T10:56:46.435494Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 1.6MB → 0.1MB (14.8x), 17 JPEGs deleted\n2026-04-23T10:56:47.618773Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 14 frames, 3.5MB → 1.0MB (3.6x), 14 JPEGs deleted\n2026-04-23T10:56:48.429385Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3009288458992913716, trigger=visual_change)\n2026-04-23T10:56:55.377427Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3009288458992913716, trigger=visual_change)\n2026-04-23T10:56:58.331194Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3009288458992913716, trigger=visual_change)\n2026-04-23T10:57:31.580363Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=164293696523982731, trigger=visual_change)\n2026-04-23T10:57:37.142409Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=164293696523982731, trigger=visual_change)\n2026-04-23T11:01:54.879662Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=43 elapsed=6.651773875s\n2026-04-23T11:01:54.879780Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 43 eligible frames\n2026-04-23T11:01:56.181324Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 20 frames, 2.1MB → 0.5MB (4.0x), 20 JPEGs deleted\n2026-04-23T11:01:57.821885Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 4.6MB → 1.2MB (4.0x), 21 JPEGs deleted\n2026-04-23T11:05:34.805879Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4133405882569027308, trigger=click)\n2026-04-23T11:05:42.692507Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-792819002159032212, trigger=click)\n2026-04-23T11:05:45.195836Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-792819002159032212, trigger=click)\n2026-04-23T11:06:58.003581Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 56 eligible frames\n2026-04-23T11:07:01.998524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 4.2MB → 2.0MB (2.1x), 27 JPEGs deleted\n2026-04-23T11:07:04.632834Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 27 frames, 6.1MB → 1.2MB (5.2x), 27 JPEGs deleted\n2026-04-23T11:08:29.041425Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=811120582590877593, trigger=click)\n2026-04-23T11:11:26.078346Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=811120582590877593, trigger=click)\n2026-04-23T11:11:26.826746Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=811120582590877593, trigger=click)\n2026-04-23T11:11:29.736291Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=811120582590877593, trigger=click)\n2026-04-23T11:11:30.502898Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=811120582590877593, trigger=click)\n2026-04-23T11:11:33.284639Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=811120582590877593, trigger=click)\n2026-04-23T11:11:34.732219Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=811120582590877593, trigger=click)\n2026-04-23T11:11:36.846175Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=811120582590877593, trigger=click)\n2026-04-23T11:11:47.161668Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=811120582590877593, trigger=visual_change)\n2026-04-23T11:11:51.463126Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=811120582590877593, trigger=click)\n2026-04-23T11:11:55.190182Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=811120582590877593, trigger=click)\n2026-04-23T11:11:58.250612Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=811120582590877593, trigger=click)\n2026-04-23T11:11:58.984195Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=811120582590877593, trigger=click)\n2026-04-23T11:12:07.186907Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=8190951420737299430, trigger=visual_change)\n2026-04-23T11:12:10.805150Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=28 elapsed=6.153365375s\n2026-04-23T11:12:10.806451Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 28 eligible frames\n2026-04-23T11:12:12.869531Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 16 frames, 2.7MB → 1.2MB (2.2x), 16 JPEGs deleted\n2026-04-23T11:12:14.462884Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB (5.9x), 10 JPEGs deleted\n2026-04-23T11:14:59.283313Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-962688942467523245, trigger=click)\n2026-04-23T11:14:59.996111Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-962688942467523245, trigger=click)\n2026-04-23T11:15:52.562512Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4085483410823602662, trigger=click)\n2026-04-23T11:16:10.556556Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-680298114769977367, trigger=click)\n2026-04-23T11:16:44.987984Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-781142721963066587, trigger=click)\n2026-04-23T11:17:15.717626Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=34 elapsed=1.192290209s\n2026-04-23T11:17:15.717877Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 34 eligible frames\n2026-04-23T11:17:16.801524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 14 frames, 1.7MB → 0.3MB (6.4x), 14 JPEGs deleted\n2026-04-23T11:17:18.950114Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 4.0MB → 0.9MB (4.3x), 18 JPEGs deleted\n2026-04-23T11:22:21.353046Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=27 elapsed=2.391216916s\n2026-04-23T11:22:21.353161Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 27 eligible frames\n2026-04-23T11:22:22.204810Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.6MB → 0.2MB (7.8x), 13 JPEGs deleted\n2026-04-23T11:22:23.352237Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 12 frames, 2.7MB → 1.1MB (2.5x), 12 JPEGs deleted\n2026-04-23T11:22:51.641783Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5591071779487381740, trigger=visual_change)\n2026-04-23T11:24:42.126313Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3622496340535697523, trigger=click)\n2026-04-23T11:27:16.328827Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3622496340535697523, trigger=click)\n2026-04-23T11:27:17.062717Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3622496340535697523, trigger=click)\n2026-04-23T11:27:20.131333Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3622496340535697523, trigger=visual_change)\n2026-04-23T11:27:27.263965Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=32 elapsed=2.915186083s\n2026-04-23T11:27:27.264345Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames\n2026-04-23T11:27:29.317049Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 16 frames, 2.1MB → 0.6MB (3.5x), 16 JPEGs deleted\n2026-04-23T11:27:31.637712Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 14 frames, 3.0MB → 0.8MB (3.8x), 14 JPEGs deleted\n2026-04-23T11:29:03.406489Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1491366973306919482, trigger=visual_change)\n2026-04-23T11:29:37.371120Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-1491366973306919482, trigger=click)\n2026-04-23T11:29:38.828999Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1491366973306919482, trigger=click)\n2026-04-23T11:30:05.594417Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7420299184765789117, trigger=click)\n2026-04-23T11:30:10.415695Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7420299184765789117, trigger=click)\n2026-04-23T11:30:37.438406Z INFO screenpipe_engine::meeting_detector: meeting v2: Idle -> Confirming (app=Firefox, signals=2)\n2026-04-23T11:30:47.134756Z INFO screenpipe_engine::meeting_detector: meeting v2: Confirming -> Active (app=Firefox, signals=2, browser=true)\n2026-04-23T11:30:47.150842Z INFO screenpipe_engine::meeting_detector: meeting v2: meeting started (id=10, app=Firefox, title=None)\n2026-04-23T11:32:52.795697Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=click, monitor=1) — DB pool may be saturated\n2026-04-23T11:32:54.063047Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=22 elapsed=22.405129875s\n2026-04-23T11:32:54.065127Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 22 eligible frames\n2026-04-23T11:32:56.659956Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.7MB → 0.3MB (5.8x), 10 JPEGs deleted\n2026-04-23T11:32:58.390326Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.1MB → 0.4MB (5.1x), 10 JPEGs deleted\n2026-04-23T11:32:58.454323Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=click, monitor=2) — DB pool may be saturated\n2026-04-23T11:33:03.630685Z INFO screenpipe_engine::event_driven_capture: monitor 2 capture recovered after 1 consecutive errors\n2026-04-23T11:33:03.698376Z INFO screenpipe_engine::event_driven_capture: monitor 1 capture recovered after 1 consecutive errors\n2026-04-23T11:34:08.146813Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=visual_change, monitor=1) — DB pool may be saturated\n2026-04-23T11:34:19.115606Z INFO screenpipe_engine::event_driven_capture: monitor 1 capture recovered after 1 consecutive errors\n2026-04-23T11:38:06.413998Z WARN sqlx::query: summary=\"PRAGMA wal_checkpoint(TRUNCATE)\" db.statement=\"\" rows_affected=0 rows_returned=1 elapsed=5.320189792s\n2026-04-23T11:38:06.417026Z WARN screenpipe_db::db: wal checkpoint: busy (could not truncate), 1136 pages in WAL\n2026-04-23T11:38:06.480369Z WARN sqlx::query: summary=\"BEGIN IMMEDIATE\" db.statement=\"\" rows_affected=1 rows_returned=0 elapsed=3.645234084s\n2026-04-23T11:38:12.229580Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=26 elapsed=13.80812125s\n2026-04-23T11:38:12.232573Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 26 eligible frames\n2026-04-23T11:38:15.382662Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 1.9MB → 0.5MB (3.8x), 11 JPEGs deleted\n2026-04-23T11:38:16.795794Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=visual_change, monitor=1) — DB pool may be saturated\n2026-04-23T11:38:19.817599Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 2.7MB → 0.6MB (4.2x), 13 JPEGs deleted\n2026-04-23T11:38:24.993308Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=visual_change, monitor=2) — DB pool may be saturated\n2026-04-23T11:38:30.141938Z INFO screenpipe_engine::event_driven_capture: monitor 1 capture recovered after 1 consecutive errors\n2026-04-23T11:38:34.776814Z INFO screenpipe_engine::event_driven_capture: monitor 2 capture recovered after 1 consecutive errors\n2026-04-23T11:40:55.703155Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5781407336396073109, trigger=visual_change)\n2026-04-23T11:41:02.662314Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5781407336396073109, trigger=visual_change)\n2026-04-23T11:41:09.390136Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5781407336396073109, trigger=visual_change)\n2026-04-23T11:41:16.161715Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5781407336396073109, trigger=visual_change)\n2026-04-23T11:41:37.205648Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5781407336396073109, trigger=visual_change)\n2026-04-23T11:42:04.257036Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5781407336396073109, trigger=visual_change)\n2026-04-23T11:42:21.214633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6679997250984875896, trigger=visual_change)\n2026-04-23T11:42:24.525053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6679997250984875896, trigger=visual_change)\n2026-04-23T11:42:29.877589Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6679997250984875896, trigger=visual_change)\n2026-04-23T11:42:33.802238Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6679997250984875896, trigger=visual_change)\n2026-04-23T11:42:36.923509Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6679997250984875896, trigger=visual_change)\n2026-04-23T11:42:57.455576Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6679997250984875896, trigger=visual_change)\n2026-04-23T11:43:12.031547Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=951548071599591969, trigger=visual_change)\n2026-04-23T11:43:18.874182Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=951548071599591969, trigger=visual_change)\n2026-04-23T11:43:24.247849Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=951548071599591969, trigger=visual_change)\n2026-04-23T11:43:26.259182Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=49 elapsed=6.405864s\n2026-04-23T11:43:26.263056Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 49 eligible frames\n2026-04-23T11:43:32.316690Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 23 frames, 3.7MB → 1.8MB (2.0x), 23 JPEGs deleted\n2026-04-23T11:43:34.974978Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=951548071599591969, trigger=visual_change)\n2026-04-23T11:43:36.047883Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 4.3MB → 1.5MB (2.9x), 24 JPEGs deleted\n2026-04-23T11:43:49.116309Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=951548071599591969, trigger=visual_change)\n2026-04-23T11:43:52.940018Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=951548071599591969, trigger=visual_change)\n2026-04-23T11:43:56.539135Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=951548071599591969, trigger=visual_change)\n2026-04-23T11:44:11.233290Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4079677798565982376, trigger=visual_change)\n2026-04-23T11:45:03.923694Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=click, monitor=2) — DB pool may be saturated\n2026-04-23T11:45:18.638512Z INFO screenpipe_engine::event_driven_capture: monitor 2 capture recovered after 1 consecutive errors\n2026-04-23T11:45:27.824824Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=click, monitor=1) — DB pool may be saturated\n2026-04-23T11:45:41.576372Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=click, monitor=2) — DB pool may be saturated\n2026-04-23T11:45:44.291896Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=click, monitor=1) — DB pool may be saturated\n2026-04-23T11:46:03.257280Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=click, monitor=1) — DB pool may be saturated\n2026-04-23T11:46:12.724398Z WARN screenpipe_engine::event_driven_capture: event capture timed out (trigger=visual_change, monitor=2) — DB pool may be saturated\n2026-04-23T11:46:22.727197Z INFO screenpipe_engine::event_driven_capture: monitor 1 capture recovered after 3 consecutive errors\n2026-04-23T11:46:24.228006Z INFO screenpipe_engine::event_driven_capture: monitor 2 capture recovered after 2 consecutive errors\n2026-04-23T11:46:40.390580Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7643951286516936585, trigger=visual_change)\n2026-04-23T11:46:49.248747Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7643951286516936585, trigger=visual_change)\n2026-04-23T11:46:55.471031Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7643951286516936585, trigger=visual_change)\n2026-04-23T11:47:02.336575Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7643951286516936585, trigger=visual_change)\n2026-04-23T11:48:17.252755Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7643951286516936585, trigger=visual_change)\n2026-04-23T11:48:25.013997Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7643951286516936585, trigger=visual_change)\n2026-04-23T11:48:53.059242Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=56 elapsed=13.220216708s\n2026-04-23T11:48:53.065643Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 56 eligible frames\n2026-04-23T11:48:58.527594Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 30 frames, 4.7MB → 2.2MB (2.1x), 30 JPEGs deleted\n2026-04-23T11:49:05.857012Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 4.3MB → 1.6MB (2.7x), 24 JPEGs deleted\n2026-04-23T11:49:06.658338Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5995459936453258264, trigger=visual_change)\n2026-04-23T11:49:28.247468Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5995459936453258264, trigger=visual_change)\n2026-04-23T11:49:46.108336Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4001297392414942723, trigger=visual_change)\n2026-04-23T11:49:53.084297Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4001297392414942723, trigger=visual_change)\n2026-04-23T11:49:56.028797Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4001297392414942723, trigger=click)\n2026-04-23T11:50:37.287127Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2527600923706712259, trigger=visual_change)\n2026-04-23T11:51:12.946650Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1489108089542937642, trigger=visual_change)\n2026-04-23T11:51:19.338386Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=1489108089542937642, trigger=visual_change)\n2026-04-23T11:52:16.352383Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8163356110886780433, trigger=visual_change)\n2026-04-23T11:53:55.890568Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5293025605401136867, trigger=click)\n2026-04-23T11:54:09.640558Z WARN sqlx::query: summary=\"SELECT id, snapshot_path, device_name, …\" db.statement=\"\\n\\nSELECT\\n id,\\n snapshot_path,\\n device_name,\\n timestamp\\nFROM\\n frames\\nWHERE\\n snapshot_path IS NOT NULL\\n AND timestamp < ?1\\nORDER BY\\n device_name,\\n timestamp ASC\\nLIMIT\\n 5000\\n\" rows_affected=0 rows_returned=41 elapsed=3.460436583s\n2026-04-23T11:54:09.640693Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 41 eligible frames\n2026-04-23T11:54:13.152878Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.3MB → 1.5MB (2.2x), 22 JPEGs deleted\n2026-04-23T11:54:15.204535Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 3.9MB → 1.2MB (3.4x), 17 JPEGs deleted\n2026-04-23T11:58:11.876342Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=10, grace=300s)\n2026-04-23T11:59:15.385310Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 25 eligible frames\n2026-04-23T11:59:16.921656Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 1.6MB → 0.6MB (2.8x), 13 JPEGs deleted\n2026-04-23T11:59:18.047335Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.2MB → 1.0MB (2.3x), 10 JPEGs deleted\n2026-04-23T12:01:17.114786Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7823854956395915880, trigger=click)\n/Volumes/Work/2026/User\\ Pilot\\ introduction\\ Adi\\ 2026-04-23.mp4 2026-04-23T12:02:09.213929Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4997183725580178172, trigger=visual_change)\n2026-04-23T12:02:12.305485Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-4997183725580178172, trigger=visual_change)\n2026-04-23T12:02:22.392607Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4428370940474457947, trigger=visual_change)\n2026-04-23T12:02:23.534043Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4428370940474457947, trigger=click)\n2026-04-23T12:02:25.338561Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4428370940474457947, trigger=click)\n2026-04-23T12:02:26.896633Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4428370940474457947, trigger=click)\n2026-04-23T12:03:14.422791Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Idle (timeout=300s, app=Firefox, id=10)\n2026-04-23T12:03:14.697666Z INFO screenpipe_engine::meeting_detector: meeting v2: meeting ended (id=10)\n2026-04-23T12:04:18.652471Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 62 eligible frames\n2026-04-23T12:04:22.291047Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 36 frames, 4.6MB → 1.6MB (3.0x), 36 JPEGs deleted\n2026-04-23T12:04:25.831665Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 4.8MB → 1.1MB (4.3x), 24 JPEGs deleted\n2026-04-23T12:04:36.186162Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8094579906910625439, trigger=click)","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.031083776,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.30136302,"top":1.0,"width":0.031083776,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.30335772,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.3324468,"top":1.0,"width":0.031083776,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33444148,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"✳ Build full day activity summary from Screenpipe (claude)","depth":2,"bounds":{"left":0.36353058,"top":1.0,"width":0.031083776,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.36552528,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.39461437,"top":1.0,"width":0.031083776,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.39660904,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.42569813,"top":1.0,"width":0.031083776,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42769283,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.45678192,"top":1.0,"width":0.030917553,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.4587766,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-159-186:~ (-zsh)","depth":2,"bounds":{"left":0.48769948,"top":1.0,"width":0.030917553,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.48969415,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.5049867,"top":1.0,"width":0.01861702,"height":-0.023144484},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"screenpipe\" — 95✕45","depth":1,"bounds":{"left":0.37400267,"top":1.0,"width":0.04886968,"height":-0.02394259},"role_description":"text"}]...
|
3112232738136535939
|
986754612592747899
|
visual_change
|
accessibility
|
NULL
|
2026-04-23T09:13:09.380863Z INFO sck_rs::stream_m 2026-04-23T09:13:09.380863Z INFO sck_rs::stream_manager: invalidated persistent stream for display 2
2026-04-23T09:13:32.742255Z INFO sck_rs::stream_manager: persistent SCK stream started for display 2 (3008x1253, 2fps, 3 excluded)
2026-04-23T09:14:01.764079Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=4702465002163205464, trigger=click)
2026-04-23T09:14:04.223149Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=4702465002163205464, trigger=visual_change)
2026-04-23T09:14:06.953796Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=147 elapsed=6.3719465s
2026-04-23T09:14:06.954006Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 147 eligible frames
2026-04-23T09:14:12.566935Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 70 frames, 10.3MB → 2.7MB (3.8x), 70 JPEGs deleted
2026-04-23T09:14:17.358704Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 75 frames, 9.6MB → 3.0MB (3.2x), 75 JPEGs deleted
2026-04-23T09:15:47.544198Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3660881845293713510, trigger=visual_change)
2026-04-23T09:15:50.997492Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3660881845293713510, trigger=click)
2026-04-23T09:15:51.600725Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3660881845293713510, trigger=click)
2026-04-23T09:15:55.723800Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3660881845293713510, trigger=click)
2026-04-23T09:15:56.933987Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3660881845293713510, trigger=visual_change)
2026-04-23T09:15:59.012409Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3660881845293713510, trigger=visual_change)
2026-04-23T09:16:49.882963Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3759145274440377841, trigger=visual_change)
2026-04-23T09:16:51.405936Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3759145274440377841, trigger=click)
2026-04-23T09:16:52.823011Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3759145274440377841, trigger=click)
2026-04-23T09:16:54.220304Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3759145274440377841, trigger=click)
2026-04-23T09:16:54.887021Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3759145274440377841, trigger=click)
2026-04-23T09:16:58.589203Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-3759145274440377841, trigger=visual_change)
2026-04-23T09:18:05.879649Z WARN screenpipe_db::db: wal checkpoint: busy (could not truncate), 5054 pages in WAL
2026-04-23T09:18:05.879619Z WARN sqlx::query: summary="PRAGMA wal_checkpoint(TRUNCATE)" db.statement="" rows_affected=0 rows_returned=1 elapsed=5.220339167s
2026-04-23T09:19:24.740122Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=2 elapsed=7.381061833s
2026-04-23T09:19:24.740850Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 2 eligible frames
2026-04-23T09:19:36.514406Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=2079049776495123607, trigger=click)
2026-04-23T09:24:26.477446Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=11 elapsed=1.729545666s
2026-04-23T09:24:26.477540Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 11 eligible frames
2026-04-23T09:24:27.316363Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 5 frames, 1.4MB → 1.4MB (1.0x), 5 JPEGs deleted
2026-04-23T09:24:27.966623Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 6 frames, 0.6MB → 0.2MB (2.7x), 6 JPEGs deleted
2026-04-23T09:24:42.606557Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:26:03.160247Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7786631749263421517, trigger=click)
2026-04-23T09:27:26.154494Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:27:34.433056Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:28:06.713361Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:28:33.527151Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5209591986308457575, trigger=click)
2026-04-23T09:28:34.249353Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5209591986308457575, trigger=click)
2026-04-23T09:28:36.237199Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5209591986308457575, trigger=click)
2026-04-23T09:28:42.253183Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=8747303508868961364, trigger=click)
2026-04-23T09:28:48.282686Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:28:50.613134Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:28:51.314522Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:29:31.961577Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=67 elapsed=3.996031s
2026-04-23T09:29:31.961670Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 67 eligible frames
2026-04-23T09:29:34.332658Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 29 frames, 5.8MB → 2.1MB (2.8x), 29 JPEGs deleted
2026-04-23T09:29:38.223511Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 36 frames, 7.4MB → 3.8MB (2.0x), 36 JPEGs deleted
2026-04-23T09:30:34.230785Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:30:39.665086Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:30:40.299751Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:30:45.663893Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:30:51.622228Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:30:52.321014Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:31:15.021588Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:31:15.691601Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:31:17.946692Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:31:18.653547Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:32:17.960360Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:32:24.051490Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:32:29.442560Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:32:30.131038Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:32:32.452540Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:32:36.585069Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:32:39.322258Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:33:18.072421Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:33:18.766929Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:33:22.098409Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:33:22.782084Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:34:27.313290Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:34:38.542722Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 89 eligible frames
2026-04-23T09:34:41.684595Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 38 frames, 5.6MB → 0.7MB (7.5x), 38 JPEGs deleted
2026-04-23T09:34:44.933963Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 49 frames, 10.6MB → 3.8MB (2.8x), 49 JPEGs deleted
2026-04-23T09:37:57.963204Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:37:58.697604Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:38:02.124214Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:38:53.190171Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:38:59.279885Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:39:02.308536Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:39:36.189861Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:39:49.122120Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=50 elapsed=4.188474542s
2026-04-23T09:39:49.122232Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 50 eligible frames
2026-04-23T09:39:51.115025Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 2.9MB → 0.3MB (9.4x), 24 JPEGs deleted
2026-04-23T09:39:53.096763Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 24 frames, 5.0MB → 2.3MB (2.2x), 24 JPEGs deleted
2026-04-23T09:40:57.095660Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:40:58.430714Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:41:01.130926Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:41:01.840278Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:41:04.072034Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:41:09.252541Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:41:09.972092Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:41:12.313228Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:41:13.696141Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:41:15.723102Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:41:16.452657Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:42:46.382248Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:43:42.993741Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=6469703639183038647, trigger=visual_change)
2026-04-23T09:44:17.245560Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=7072623502562616708, trigger=visual_change)
2026-04-23T09:44:56.342637Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=21 elapsed=2.944921084s
2026-04-23T09:44:56.343212Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 21 eligible frames
2026-04-23T09:44:57.216675Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 1.2MB → 0.2MB (6.9x), 10 JPEGs deleted
2026-04-23T09:44:58.298212Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 9 frames, 2.1MB → 0.7MB (2.8x), 9 JPEGs deleted
2026-04-23T09:45:10.982752Z INFO screenpipe_engine::meeting_detector: meeting v2: Idle -> Confirming (app=Firefox, signals=2)
2026-04-23T09:45:16.376695Z INFO screenpipe_engine::meeting_detector: meeting v2: Confirming -> Active (app=Firefox, signals=2, browser=true)
2026-04-23T09:45:16.378791Z INFO screenpipe_engine::meeting_detector: meeting v2: meeting started (id=9, app=Firefox, title=None)
2026-04-23T09:50:01.989691Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=23 elapsed=3.688976042s
2026-04-23T09:50:01.989962Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 23 eligible frames
2026-04-23T09:50:03.098505Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 1.3MB → 0.2MB (7.4x), 11 JPEGs deleted
2026-04-23T09:50:04.627741Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 10 frames, 2.4MB → 0.8MB (3.1x), 10 JPEGs deleted
2026-04-23T09:50:07.629323Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-4672421675042950776, trigger=click)
2026-04-23T09:52:11.400798Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:52:15.346773Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:52:18.174934Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:52:22.107623Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:52:32.020499Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:53:33.890239Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:53:35.304629Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:53:58.176084Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:54:14.248454Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:54:18.287472Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:54:20.289467Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:54:24.904239Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:54:27.981243Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:54:29.172367Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:54:30.192245Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:54:31.161165Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T09:55:11.821088Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=36 elapsed=7.192436875s
2026-04-23T09:55:11.821248Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 36 eligible frames
2026-04-23T09:55:13.532739Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 2.3MB → 0.5MB (5.0x), 19 JPEGs deleted
2026-04-23T09:55:16.625152Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 15 frames, 3.3MB → 1.4MB (2.4x), 15 JPEGs deleted
2026-04-23T09:56:01.584150Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:56:24.887186Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3078857793355977422, trigger=click)
2026-04-23T09:56:32.005363Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3078857793355977422, trigger=visual_change)
2026-04-23T09:56:41.374227Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3078857793355977422, trigger=visual_change)
2026-04-23T09:56:54.666839Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3078857793355977422, trigger=click)
2026-04-23T09:57:06.486753Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3593283938725328408, trigger=visual_change)
2026-04-23T09:57:14.384178Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5341343601501307187, trigger=visual_change)
2026-04-23T09:57:32.721765Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5341343601501307187, trigger=visual_change)
2026-04-23T09:59:03.111441Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T09:59:18.292184Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:59:24.203906Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:59:28.763273Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T09:59:36.189282Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T10:00:16.817081Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 72 eligible frames
2026-04-23T10:00:21.637421Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 45 frames, 7.5MB → 3.5MB (2.1x), 45 JPEGs deleted
2026-04-23T10:00:24.683587Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 25 frames, 4.4MB → 1.4MB (3.2x), 25 JPEGs deleted
2026-04-23T10:00:40.573974Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6464745230001326344, trigger=visual_change)
2026-04-23T10:02:52.495992Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-8171437999531431641, trigger=click)
2026-04-23T10:02:53.374393Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-8171437999531431641, trigger=click)
2026-04-23T10:03:37.373391Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-1961095499263201650, trigger=click)
2026-04-23T10:04:58.338820Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T10:05:04.300061Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T10:05:10.114887Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T10:05:16.104422Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T10:05:20.754499Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T10:05:25.933831Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T10:05:30.717296Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=45 elapsed=5.043796209s
2026-04-23T10:05:30.717708Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 45 eligible frames
2026-04-23T10:05:33.129158Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.5MB → 1.3MB (2.8x), 21 JPEGs deleted
2026-04-23T10:05:35.719261Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 22 frames, 3.9MB → 1.6MB (2.5x), 22 JPEGs deleted
2026-04-23T10:06:54.427408Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T10:06:58.568476Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T10:07:35.294176Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T10:07:36.671700Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=click)
2026-04-23T10:07:46.281682Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=3407362332434637772, trigger=click)
2026-04-23T10:10:42.001975Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=40 elapsed=6.278440792s
2026-04-23T10:10:42.002064Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 40 eligible frames
2026-04-23T10:10:45.302375Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 21 frames, 3.7MB → 1.7MB (2.2x), 21 JPEGs deleted
2026-04-23T10:10:47.110830Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.4MB → 0.6MB (7.8x), 17 JPEGs deleted
2026-04-23T10:12:18.002465Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-7144568667011834365, trigger=click)
2026-04-23T10:13:16.229637Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3362537224271461493, trigger=visual_change)
2026-04-23T10:13:20.127210Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3362537224271461493, trigger=visual_change)
2026-04-23T10:15:43.498044Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-602531024127880156, trigger=visual_change)
2026-04-23T10:15:46.873827Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-602531024127880156, trigger=visual_change)
2026-04-23T10:15:49.085137Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames
2026-04-23T10:15:49.496235Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-602531024127880156, trigger=visual_change)
2026-04-23T10:15:50.519319Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 3.0MB → 0.9MB (3.3x), 17 JPEGs deleted
2026-04-23T10:15:51.657703Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 3.4MB → 0.5MB (6.7x), 13 JPEGs deleted
2026-04-23T10:15:53.186964Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-602531024127880156, trigger=visual_change)
2026-04-23T10:15:55.743993Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-602531024127880156, trigger=visual_change)
2026-04-23T10:16:10.260016Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7730332891388508974, trigger=visual_change)
2026-04-23T10:16:19.398464Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5862100523266843105, trigger=visual_change)
2026-04-23T10:16:23.686689Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5862100523266843105, trigger=visual_change)
2026-04-23T10:16:27.662719Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5862100523266843105, trigger=visual_change)
2026-04-23T10:16:34.159786Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5862100523266843105, trigger=visual_change)
2026-04-23T10:17:00.356336Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5862100523266843105, trigger=visual_change)
2026-04-23T10:17:22.481007Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3265723714621232205, trigger=visual_change)
2026-04-23T10:17:29.195939Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-3265723714621232205, trigger=visual_change)
2026-04-23T10:17:47.685112Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)
2026-04-23T10:17:51.199158Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)
2026-04-23T10:17:58.199222Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)
2026-04-23T10:18:06.327777Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)
2026-04-23T10:18:13.175283Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)
2026-04-23T10:18:39.739176Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)
2026-04-23T10:19:27.720698Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)
2026-04-23T10:19:31.148096Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)
2026-04-23T10:19:35.991910Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)
2026-04-23T10:19:56.855761Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)
2026-04-23T10:20:03.521058Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)
2026-04-23T10:20:10.069690Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)
2026-04-23T10:20:18.117006Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3396265690023637464, trigger=visual_change)
2026-04-23T10:20:54.473088Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=27 elapsed=2.810096209s
2026-04-23T10:20:54.473356Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 27 eligible frames
2026-04-23T10:20:56.920972Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 14 frames, 2.2MB → 0.9MB (2.6x), 14 JPEGs deleted
2026-04-23T10:20:58.678464Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 11 frames, 2.5MB → 0.8MB (3.0x), 11 JPEGs deleted
2026-04-23T10:23:10.727426Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3844820439140861821, trigger=visual_change)
2026-04-23T10:25:16.468416Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T10:25:32.507777Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3407362332434637772, trigger=visual_change)
2026-04-23T10:26:05.910946Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=33 elapsed=7.132200208s
2026-04-23T10:26:05.912569Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 33 eligible frames
2026-04-23T10:26:09.921886Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 18 frames, 3.0MB → 1.2MB (2.5x), 18 JPEGs deleted
2026-04-23T10:26:13.670275Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 2.6MB → 0.9MB (3.0x), 13 JPEGs deleted
2026-04-23T10:26:20.034712Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=click)
2026-04-23T10:26:22.436991Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=click)
2026-04-23T10:26:25.816727Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:27:46.056157Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-1615606372458852745, trigger=click)
2026-04-23T10:28:05.117587Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:28:16.307383Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:28:22.684004Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:28:39.022530Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:28:44.950116Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:28:50.090325Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:28:52.144212Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:28:55.229550Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=click)
2026-04-23T10:28:59.714370Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=click)
2026-04-23T10:29:08.010841Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=click)
2026-04-23T10:29:11.877274Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=click)
2026-04-23T10:29:15.515889Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=click)
2026-04-23T10:29:19.052095Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=click)
2026-04-23T10:29:21.109938Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=click)
2026-04-23T10:29:28.551159Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:29:30.947483Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:29:38.350095Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:29:51.477755Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:29:56.846851Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:30:02.584960Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:30:06.779849Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:30:18.311444Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:30:22.665242Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:30:29.333028Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:30:37.983139Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:30:48.829636Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=click)
2026-04-23T10:30:59.474314Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=3712905987097609358, trigger=visual_change)
2026-04-23T10:31:16.115641Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=34 elapsed=1.523826083s
2026-04-23T10:31:16.115774Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 34 eligible frames
2026-04-23T10:31:19.674413Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 3.4MB → 2.0MB (1.7x), 19 JPEGs deleted
2026-04-23T10:31:20.281876Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:31:21.222414Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 3.4MB → 0.8MB (4.5x), 13 JPEGs deleted
2026-04-23T10:31:30.589390Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:31:31.649068Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:31:34.542890Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:31:35.913592Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:31:42.222598Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:31:46.314096Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:31:56.457995Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=visual_change)
2026-04-23T10:32:02.440693Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-2090548142966872323, trigger=click)
2026-04-23T10:32:11.844302Z INFO screenpipe_engine::meeting_detector: meeting v2: Active -> Ending (no controls, app=Firefox, id=9, grace=300s)
2026-04-23T10:36:21.778297Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 34 eligible frames
2026-04-23T10:36:23.408803Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 19 frames, 3.2MB → 1.6MB (2.1x), 19 JPEGs deleted
2026-04-23T10:36:24.427188Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 3.4MB → 0.7MB (4.8x), 13 JPEGs deleted
2026-04-23T10:37:15.245266Z INFO screenpipe_engine::meeting_detector: meeting v2: Ending -> Idle (timeout=300s, app=Firefox, id=9)
2026-04-23T10:37:15.499978Z INFO screenpipe_engine::meeting_detector: meeting v2: meeting ended (id=9)
2026-04-23T10:39:08.136849Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=7072094695368023128, trigger=visual_change)
2026-04-23T10:40:10.173692Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5626541066854626210, trigger=visual_change)
2026-04-23T10:41:03.187335Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-6908211675272154683, trigger=visual_change)
2026-04-23T10:41:27.801144Z WARN sqlx::query: summary="SELECT id, snapshot_path, device_name, …" db.statement="\n\nSELECT\n id,\n snapshot_path,\n device_name,\n timestamp\nFROM\n frames\nWHERE\n snapshot_path IS NOT NULL\n AND timestamp < ?1\nORDER BY\n device_name,\n timestamp ASC\nLIMIT\n 5000\n" rows_affected=0 rows_returned=32 elapsed=3.230263875s
2026-04-23T10:41:27.801229Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 32 eligible frames
2026-04-23T10:41:30.240257Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 2.7MB → 1.1MB (2.4x), 17 JPEGs deleted
2026-04-23T10:41:31.414104Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 13 frames, 3.3MB → 1.1MB (3.1x), 13 JPEGs deleted
2026-04-23T10:43:59.795473Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=click)
2026-04-23T10:44:00.574274Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)
2026-04-23T10:44:03.353223Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=visual_change)
2026-04-23T10:44:06.333413Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=visual_change)
2026-04-23T10:44:15.554031Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=click)
2026-04-23T10:44:16.272856Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)
2026-04-23T10:44:36.868831Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=visual_change)
2026-04-23T10:44:52.509317Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=visual_change)
2026-04-23T10:45:05.711036Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=visual_change)
2026-04-23T10:45:15.149681Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=click)
2026-04-23T10:45:15.874930Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)
2026-04-23T10:45:18.722067Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)
2026-04-23T10:45:27.888960Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=visual_change)
2026-04-23T10:45:32.102259Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)
2026-04-23T10:45:47.964284Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-250182447663358748, trigger=click)
2026-04-23T10:45:57.352178Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-250182447663358748, trigger=click)
2026-04-23T10:45:58.059330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-250182447663358748, trigger=click)
2026-04-23T10:46:00.786122Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-250182447663358748, trigger=click)
2026-04-23T10:46:01.515587Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-250182447663358748, trigger=click)
2026-04-23T10:46:32.335524Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: found 34 eligible frames
2026-04-23T10:46:33.454412Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 15 frames, 1.3MB → 0.3MB (4.3x), 15 JPEGs deleted
2026-04-23T10:46:35.185172Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction: 17 frames, 4.4MB → 0.8MB (5.1x), 17 JPEGs deleted
2026-04-23T10:49:51.424053Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)
2026-04-23T10:49:52.278022Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=5090325678268650097, trigger=click)
2026-04-23T10:50:06.945403Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=visual_change)
2026-04-23T10:50:20.071306Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)
2026-04-23T10:50:27.322330Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=5090325678268650097, trigger=click)
2026-04-23T10:50:28.025501Z INFO screenpipe_engine::event_driven_capture: content dedup: skipping captur...
|
74139
|
NULL
|
|
81022
|
2157
|
10
|
2026-04-25T15:56:19.134482+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-25/1777 /Users/lukas/.screenpipe/data/data/2026-04-25/1777132579134_m2.jpg...
|
Code
|
screenpipe_sync.sh — screenpipe [SSH: nas]
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G) - 2 pending changes
2
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: nas]
Explorer Section: screenpipe [SSH: nas]
SCREENPIPE [SSH: NAS]
#recycle
app
data
pipes
.gitignore
app_settings.json
archive.db
db.sqlite
screenpipe_sync.sh
screenpipe.db
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
app_settings.json, Editor Group 1
screenpipe_sync.sh, Editor Group 1
db.sqlite-shm, preview, Editor Group 1
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lets add ability to jump…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: nas
SSH: nas
screenpipe (Git) - master*, Checkout Branch/Tag...
master*
screenpipe (Git) - Synchronize Changes
No Problems
0
0
No Ports Forwarded
0
Notifications
Signed out
Signed out
Shell Script
Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions
LF
UTF-8
Spaces: 2
Ln 331, Col 48
Screen Reader Optimized
git-commit Lukas Kovalik (23 hours ago)
Lukas Kovalik (23 hours ago)
Info: Downloading VS Code Server...
lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time
Session history
New session
Message actions
This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.
Summary:
1. Primary Request and Intent:
The user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:
- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.
- **Q2**: AND combination search (term1 + term2 must both appear) → Added "AND also" input field.
- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.
- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.
- **Q5**: "still the same" (container not picking up config) → Explained `up -d` vs `restart`.
- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.
- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.
- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.
- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.
2. Key Technical Concepts:
- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.
- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.
- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.
- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.
- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.
- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.
- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.
- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.
- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.
- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.
- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\#recycle/`.
3. Files and Code Sections:
- **`/volume1/screenpipe/app/main.py`**
- Added `/api/apps` endpoint (all unique app names from frames table)
- Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)
- `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: "..."}`
- Key snippet:
```python
@app.get("/api/timetable"
)
async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):
...
rows = conn.execute(f"""
SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,
f.offset_index, f.snapshot_path,
vc.file_path AS video_path, vc.fps AS video_fps
FROM frames f
JOIN video_chunks vc ON f.video_chunk_id = vc.id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND f.video_chunk_id IS NOT NULL {dev_clause}
ORDER BY f.timestamp
""", params).fetchall()
# seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)
```
- **`/volume1/screenpipe/app/docker-compose.yml`**
- Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`
- Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`
- screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`
- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)
- **Search enhancements**:
- Added `id="sq2"` "AND also" input between search-row1 and search-row2
- Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id="msOnlyApps"`, `id="msSkipApps"`)
- Updated `buildUrl()` to combine `q + " " + q2` and convert times with `localTimeToUtc()`
- Added `fmtDateTime(ts)` showing "Apr 20 14:08" format
- Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC
- Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`
- **Timetable tab** (new page):
- Tab button added between Work Report and AI Summary
- `showPage` array updated: `['activity','search','audio','report','timetable','summary']`
- `refresh()` calls `loadTimetable()` when on timetable page
- **Timetable CSS** (key styles):
```css
.tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }
.tt-inner { position:relative; height:52px; } /* width set dynamically */
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
.tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }
.tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }
```
- **Timetable JS state variables**:
```javascript
let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;
let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;
const _ttAppColors = {};
const TT_ZOOMS = [1, 2, 4, 8, 16, 32];
const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};
```
- **Key JS functions**:
- `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders
- `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead
- `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)
- `ttOverviewClick(e)` — scrolls timeline + seeks video
- `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`
- `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`
- `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video
- `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked
- `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`
- `_ttShowNow(f)` — updates screenshot thumbnail + now-text div
- `ttSyncBtn()` — syncs play/pause button text
- Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom
- **`/volume1/screenpipe/.gitignore`**
```
*.db, *.sqlite, *.sqlite-shm, *.sqlite-wal
data/, \#recycle/,
@eaDir/
app_settings.json, app/.env
__pycache__/, *.pyc, .DS_Store
```
4. Errors and Fixes:
- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\#recycle/`. Also had to `git rm --cached "#recycle/desktop.ini"` to unstage it.
- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.
- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.
- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.
- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.
5. Problem Solving:
- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.
- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.
- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).
- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.
6. All User Messages:
- "do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps."
- "doi I need to restart?"
- "there is sudo docker compose"
- "no still the same"
- "add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git"
- "just do it" (re: git push)
- "how to make sure data in :8767 are accurate and point to archive.db"
- "I can't see older than 16th there should 21st of april. In http://[IP_ADDRESS]:8766/ I can see all but not on sqlite viewer http://[IP_ADDRESS]:8767"
- "ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive"
- [docker compose output showing orphan container error]
- "looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast"
- "lets make the playing speed more than 8x"
- "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
7. Pending Tasks:
- **Playback speed fix** (in progress, partially done):
- Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` inside `ttInner` HTML
- Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions
- Update speed select `onchange` to call `ttSetSpeed(+this.value)`
- Add 64× option to speed select
- Update `_ttMovePlayhead` to also update `ttPlayheadTime` label
- Update `ttSyncBtn` to start/stop timer based on play state + speed
- Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)
- Rebuild Docker image after changes
8. Current Work:
Working on fixing two issues with the Timetable tab:
1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.
2. **Timeline position indicator**: Playhead not prominent enough.
**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:
```css
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
```
Session was interrupted by summary request after this CSS edit, mid-implementation.
9. Optional Next Step:
Continuing the fix for: "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
The next steps in order are:
1. Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)
2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`
3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)
4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option
5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer
6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`
If you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl
Continue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with "I'll continue" or similar. Pick up the last task as if the break never happened.
Thinking
Thinking
Bash
Find timetable speed and playhead related code
IN
grep -n "tt-playhead\|ttPlayhead\|ttInner\|_ttMovePlayhead\|ttSetSpeed\|_ttStartSpeed\|_ttStopSpeed\|ttSyncBtn\|playbackRate\|speed.*select\|spdSel\|ttSpeed" /volume1/screenpipe/app/static/index.html | head -80
Copy code to clipboard
OUT
207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
580: <div class="tt-inner" id="ttInner" onclick="ttTimelineClick(event)">
583: <div class="tt-playhead" id="ttPlayhead"></div>
598: onpause="ttSyncBtn()"
599: onplay="ttSyncBtn()">
607: <select id="ttSpeed" onchange="document.getElementById('ttVideo').playbackRate=+this.value">
1624: document.getElementById('ttInner').style.width = '100%';
1632: document.getElementById('ttPlayhead').style.display = 'none';
1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';
1700: const inner = document.getElementById('ttInner');
1710: const inner = document.getElementById('ttInner');
1718: const inner = document.getElementById('ttInner');
1750: _ttMovePlayhead(new Date(best.ts).getTime());
1772: _ttMovePlayhead(new Date(best.ts).getTime());
1791:function _ttMovePlayhead(tsMs) {
1792: const ph = document.getElementById('ttPlayhead');
1802: const ph = document.getElementById('ttPlayhead');
1805: const inner = document.getElementById('ttInner');
1819:function ttSyncBtn() {
Read
index.html
index.html
(lines 576-625)
Read
index.html
index.html
(lines 1786-1865)
Thinking
Thinking
Bash
Find chunk loading and playhead update functions
IN
grep -n "ttUpdatePlayhead\|ttNextChunk\|ttLoadChunk\|_ttCurChunk\|_ttChunks\|_ttFrames" /volume1/screenpipe/app/static/index.html | head -50
Copy code to clipboard
OUT
596: onended="ttNextChunk()"
597: ontimeupdate="ttUpdatePlayhead()"
1569:let _ttFrames = [];
1570:let _ttChunks = [];
1571:let _ttCurChunk = -1;
1607: _ttFrames = data.frames;
1609: for (const f of _ttFrames) {
1613: _ttChunks = [...chunkMap.values()];
1614: _ttCurChunk = -1;
1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();
1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();
1620: for (const f of _ttFrames) _ttColor(f.app);
1640: for (const f of _ttFrames) {
1736: if (!_ttFrames.length) return;
1737: let best = _ttFrames[0], minDiff = Infinity;
1738: for (const f of _ttFrames) {
1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);
1744: _ttCurChunk = ci;
1753:function ttNextChunk() {
1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;
1755: _ttCurChunk++;
1757: video.src = _ttChunks[_ttCurChunk][0].video_url;
1762:function ttUpdatePlayhead() {
1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;
1765: const chunk = _ttChunks[_ttCurChunk];
Read
index.html
index.html
(lines 1754-1793)
Thinking
Thinking
Read
index.html
index.html
(lines 1701-1760)
Thinking
Thinking
Read
index.html
index.html
(lines 1561-1640)
Thinking
Thinking
Bash
Find time formatting functions
IN
grep -n "function fmtTime\|function fmtDate\|function _fmt\|localTimeToUtc\|fmtDateTime" /volume1/screenpipe/app/static/index.html | head -20
Copy code to clipboard
OUT
1088: if (tf) url += `&time_from=${localTimeToUtc(tf)}`;
1089: if (tt) url += `&time_to=${localTimeToUtc(tt)}`;
1153: let meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge}`;
1166: meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge} <span class="badge ${r.is_input_device?'mic':'sys'}">${r.is_input_device?'MIC':'SYS'}</span>`;
1307:function fmtTime(ts) {
1312:function fmtDateTime(ts) {
1320:function localTimeToUtc(timeStr) {
1778:function _fmtSec(s) {
1788: `${fmtDateTime(f.ts)} · ${f.app}${f.win ? ' / ' + f.win : ''}`;
Read
index.html
index.html
(lines 1308-1327)
Thinking
Thinking
Now I have everything I need. I'll implement the frame-by-frame timer system that replaces
video.playbackRate
with wall-clock accurate playback, plus add the playhead time label. Let me make the changes:
Edit
index.html
index.html
Added 1 line...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Explorer (⇧⌘E)","depth":19,"bounds":{"left":0.0,"top":0.047885075,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.057462092,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXRadioButton","text":"Search (⇧⌘F)","depth":19,"bounds":{"left":0.0,"top":0.08619314,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.09577015,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXRadioButton","text":"Source Control (⌃⇧G) - 2 pending changes","depth":19,"bounds":{"left":0.0,"top":0.1245012,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.13407822,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXStaticText","text":"2","depth":22,"bounds":{"left":0.009640957,"top":0.1452514,"width":0.0019946808,"height":0.008778931},"role_description":"text"},{"role":"AXRadioButton","text":"Run and Debug (⇧⌘D)","depth":19,"bounds":{"left":0.0,"top":0.16280925,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.17238627,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXRadioButton","text":"Remote Explorer","depth":19,"bounds":{"left":0.0,"top":0.20111732,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.21069433,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXRadioButton","text":"Extensions (⇧⌘X) - 2 require update, 1 requires restart","depth":19,"bounds":{"left":0.0,"top":0.23942538,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.2490024,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXStaticText","text":"3","depth":22,"bounds":{"left":0.00930851,"top":0.2601756,"width":0.0023271276,"height":0.008778931},"role_description":"text"},{"role":"AXRadioButton","text":"Claude Code","depth":19,"bounds":{"left":0.0,"top":0.27773345,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"Containers","depth":19,"bounds":{"left":0.0,"top":0.3160415,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"EXPLORER","depth":17,"bounds":{"left":0.022606382,"top":0.047885075,"width":0.018949468,"height":0.02793296},"role_description":"heading"},{"role":"AXStaticText","text":"EXPLORER","depth":18,"bounds":{"left":0.022606382,"top":0.056664005,"width":0.018949468,"height":0.0103751},"role_description":"text"},{"role":"AXButton","text":"Explorer Section: screenpipe [SSH: nas]","depth":21,"bounds":{"left":0.015957447,"top":0.07581804,"width":0.09940159,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.07821229,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXHeading","text":"Explorer Section: screenpipe [SSH: nas]","depth":22,"bounds":{"left":0.022606382,"top":0.07581804,"width":0.045877658,"height":0.017557861},"role_description":"heading"},{"role":"AXStaticText","text":"SCREENPIPE [SSH: NAS]","depth":23,"bounds":{"left":0.022606382,"top":0.079010375,"width":0.045877658,"height":0.0103751},"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.09577015,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"#recycle","depth":27,"bounds":{"left":0.025930852,"top":0.09577015,"width":0.017287234,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.11332801,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"app","depth":27,"bounds":{"left":0.025930852,"top":0.11332801,"width":0.0076462766,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.10605053,"top":0.11412609,"width":0.004654255,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.13088587,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"data","depth":27,"bounds":{"left":0.025930852,"top":0.13088587,"width":0.008976064,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.14844373,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"pipes","depth":27,"bounds":{"left":0.025930852,"top":0.14844373,"width":0.010970744,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.16440542,"width":0.0063164895,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":".gitignore","depth":27,"bounds":{"left":0.025930852,"top":0.1660016,"width":0.018949468,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.1819633,"width":0.0063164895,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"app_settings.json","depth":27,"bounds":{"left":0.025930852,"top":0.18355946,"width":0.03557181,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.19952115,"width":0.0076462766,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"archive.db","depth":27,"bounds":{"left":0.025930852,"top":0.20111732,"width":0.020944148,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.21707901,"width":0.0076462766,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"db.sqlite","depth":27,"bounds":{"left":0.025930852,"top":0.21867518,"width":0.017287234,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.23463687,"width":0.0063164895,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"screenpipe_sync.sh","depth":27,"bounds":{"left":0.025930852,"top":0.23623304,"width":0.039893616,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.25219473,"width":0.0076462766,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"screenpipe.db","depth":27,"bounds":{"left":0.025930852,"top":0.25379092,"width":0.028590426,"height":0.011971269},"role_description":"text"},{"role":"AXButton","text":"Outline Section","depth":21,"bounds":{"left":0.015957447,"top":0.9473264,"width":0.09940159,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.9497207,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXHeading","text":"OUTLINE","depth":22,"bounds":{"left":0.022606382,"top":0.9473264,"width":0.01662234,"height":0.017557861},"role_description":"heading"},{"role":"AXStaticText","text":"OUTLINE","depth":23,"bounds":{"left":0.022606382,"top":0.95131683,"width":0.01662234,"height":0.0103751},"role_description":"text"},{"role":"AXButton","text":"Timeline Section","depth":21,"bounds":{"left":0.015957447,"top":0.9648843,"width":0.09940159,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.96727854,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXHeading","text":"TIMELINE","depth":22,"bounds":{"left":0.022606382,"top":0.9648843,"width":0.01761968,"height":0.017557861},"role_description":"heading"},{"role":"AXStaticText","text":"TIMELINE","depth":23,"bounds":{"left":0.022606382,"top":0.9688747,"width":0.01761968,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"app_settings.json, Editor Group 1","depth":28,"bounds":{"left":0.11569149,"top":0.047885075,"width":0.055851065,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe_sync.sh, Editor Group 1","depth":28,"bounds":{"left":0.17154256,"top":0.047885075,"width":0.06050532,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":"db.sqlite-shm, preview, Editor Group 1","depth":28,"bounds":{"left":0.23171543,"top":0.047885075,"width":0.04886968,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/Test/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","depth":28,"bounds":{"left":0.13763298,"top":0.42617717,"width":0.35804522,"height":0.014365523},"value":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/Test/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","role_description":"editor","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/Test/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","depth":29,"bounds":{"left":0.13763298,"top":0.42617717,"width":0.35804522,"height":0.014365523},"role_description":"text"},{"role":"AXRadioButton","text":"lets add ability to jump…, Editor Group 2","depth":28,"bounds":{"left":0.5578458,"top":0.047885075,"width":0.06948138,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":"Problems (⇧⌘M)","depth":22,"bounds":{"left":0.118351065,"top":0.59936154,"width":0.027925532,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PROBLEMS","depth":24,"bounds":{"left":0.122340426,"top":0.60814047,"width":0.019946808,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Output (⇧⌘U)","depth":22,"bounds":{"left":0.14594415,"top":0.59936154,"width":0.023603724,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUTPUT","depth":24,"bounds":{"left":0.14993352,"top":0.60814047,"width":0.015625,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Debug Console (⇧⌘Y)","depth":22,"bounds":{"left":0.16921543,"top":0.59936154,"width":0.039893616,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"DEBUG CONSOLE","depth":24,"bounds":{"left":0.1732048,"top":0.60814047,"width":0.031914894,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Terminal (⌃`)","depth":22,"bounds":{"left":0.2087766,"top":0.59936154,"width":0.026595745,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"TERMINAL","depth":24,"bounds":{"left":0.21276596,"top":0.60814047,"width":0.01861702,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Ports","depth":22,"bounds":{"left":0.23537233,"top":0.59936154,"width":0.020279255,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PORTS","depth":24,"bounds":{"left":0.2393617,"top":0.60814047,"width":0.012300532,"height":0.0103751},"role_description":"text"},{"role":"AXButton","text":"remote SSH: nas","depth":16,"bounds":{"left":0.0006648936,"top":0.98244214,"width":0.028590426,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.0033244682,"top":0.9848364,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"SSH: nas","depth":17,"bounds":{"left":0.008643617,"top":0.9856345,"width":0.017952127,"height":0.011173184},"role_description":"text"},{"role":"AXButton","text":"screenpipe (Git) - master*, Checkout Branch/Tag...","depth":16,"bounds":{"left":0.030917553,"top":0.98244214,"width":0.023271276,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.031914894,"top":0.9848364,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"master*","depth":17,"bounds":{"left":0.03723404,"top":0.9856345,"width":0.015957447,"height":0.011173184},"role_description":"text"},{"role":"AXButton","text":"screenpipe (Git) - Synchronize Changes","depth":16,"bounds":{"left":0.05418883,"top":0.98244214,"width":0.00731383,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"No Problems","depth":16,"bounds":{"left":0.06416223,"top":0.98244214,"width":0.022606382,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.06582447,"top":0.9848364,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"bounds":{"left":0.07114362,"top":0.9856345,"width":0.004986702,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.07579787,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"bounds":{"left":0.08111702,"top":0.9856345,"width":0.0039893617,"height":0.011173184},"role_description":"text"},{"role":"AXButton","text":"No Ports Forwarded","depth":16,"bounds":{"left":0.08843085,"top":0.98244214,"width":0.012632979,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.09009308,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"bounds":{"left":0.09541223,"top":0.9856345,"width":0.0039893617,"height":0.011173184},"role_description":"text"},{"role":"AXButton","text":"Notifications","depth":16,"bounds":{"left":0.9886968,"top":0.98244214,"width":0.010638298,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Signed out","depth":16,"bounds":{"left":0.9567819,"top":0.98244214,"width":0.031914894,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.9594415,"top":0.9848364,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Signed out","depth":17,"bounds":{"left":0.96476066,"top":0.9856345,"width":0.021276595,"height":0.011173184},"role_description":"text"},{"role":"AXButton","text":"Shell Script","depth":16,"bounds":{"left":0.93151593,"top":0.98244214,"width":0.023603724,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions","depth":16,"bounds":{"left":0.92420214,"top":0.98244214,"width":0.0076462766,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"LF","depth":16,"bounds":{"left":0.91356385,"top":0.98244214,"width":0.00831117,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"UTF-8","depth":16,"bounds":{"left":0.8962766,"top":0.98244214,"width":0.015625,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Spaces: 2","depth":16,"bounds":{"left":0.87234044,"top":0.98244214,"width":0.021941489,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Ln 331, Col 48","depth":16,"bounds":{"left":0.8390958,"top":0.98244214,"width":0.03125,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Screen Reader Optimized","depth":16,"bounds":{"left":0.7849069,"top":0.98244214,"width":0.05319149,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"git-commit Lukas Kovalik (23 hours ago)","depth":16,"bounds":{"left":0.71974736,"top":0.98244214,"width":0.06416223,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.72140956,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Lukas Kovalik (23 hours ago)","depth":17,"bounds":{"left":0.72672874,"top":0.9856345,"width":0.055518616,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"Info: Downloading VS Code Server...","depth":12,"role_description":"text"},{"role":"AXButton","text":"lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time","depth":19,"bounds":{"left":0.56017286,"top":0.08060654,"width":0.099734046,"height":0.022346368},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Session history","depth":19,"bounds":{"left":0.9780585,"top":0.08060654,"width":0.00930851,"height":0.022346368},"help_text":"Session history","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New session","depth":19,"bounds":{"left":0.9886968,"top":0.08060654,"width":0.00930851,"height":0.022346368},"help_text":"New session","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Message actions","depth":24,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.\n\nSummary:\n1. Primary Request and Intent:\n\nThe user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:\n- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.\n- **Q2**: AND combination search (term1 + term2 must both appear) → Added \"AND also\" input field.\n- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.\n- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.\n- **Q5**: \"still the same\" (container not picking up config) → Explained `up -d` vs `restart`.\n- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.\n- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.\n- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.\n- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.\n\n2. Key Technical Concepts:\n\n- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.\n- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.\n- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.\n- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.\n- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.\n- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.\n- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.\n- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.\n- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.\n- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.\n- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\\#recycle/`.\n\n3. Files and Code Sections:\n\n- **`/volume1/screenpipe/app/main.py`**\n - Added `/api/apps` endpoint (all unique app names from frames table)\n - Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)\n - `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: \"...\"}`\n - Key snippet:\n ```python","depth":26,"role_description":"text"},{"role":"AXButton","text":"@app.get(\"/api/timetable\"","depth":26,"help_text":"Open app.get(\"/api/timetable\"","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":")\n async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):\n ...\n rows = conn.execute(f\"\"\"\n SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,\n f.offset_index, f.snapshot_path,\n vc.file_path AS video_path, vc.fps AS video_fps\n FROM frames f\n JOIN video_chunks vc ON f.video_chunk_id = vc.id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND f.video_chunk_id IS NOT NULL {dev_clause}\n ORDER BY f.timestamp\n \"\"\", params).fetchall()\n # seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)\n ```\n\n- **`/volume1/screenpipe/app/docker-compose.yml`**\n - Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`\n - Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`\n - screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`\n\n- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)\n - **Search enhancements**:\n - Added `id=\"sq2\"` \"AND also\" input between search-row1 and search-row2\n - Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id=\"msOnlyApps\"`, `id=\"msSkipApps\"`)\n - Updated `buildUrl()` to combine `q + \" \" + q2` and convert times with `localTimeToUtc()`\n - Added `fmtDateTime(ts)` showing \"Apr 20 14:08\" format\n - Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC\n - Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`\n - **Timetable tab** (new page):\n - Tab button added between Work Report and AI Summary\n - `showPage` array updated: `['activity','search','audio','report','timetable','summary']`\n - `refresh()` calls `loadTimetable()` when on timetable page\n - **Timetable CSS** (key styles):\n ```css\n .tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }\n .tt-inner { position:relative; height:52px; } /* width set dynamically */\n .tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n .tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n .tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }\n .tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }\n ```\n - **Timetable JS state variables**:\n ```javascript\n let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;\n let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;\n const _ttAppColors = {};\n const TT_ZOOMS = [1, 2, 4, 8, 16, 32];\n const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};\n ```\n - **Key JS functions**:\n - `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders\n - `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead\n - `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)\n - `ttOverviewClick(e)` — scrolls timeline + seeks video\n - `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`\n - `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`\n - `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video\n - `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked\n - `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`\n - `_ttShowNow(f)` — updates screenshot thumbnail + now-text div\n - `ttSyncBtn()` — syncs play/pause button text\n - Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom\n\n- **`/volume1/screenpipe/.gitignore`**\n ```\n *.db, *.sqlite, *.sqlite-shm, *.sqlite-wal\n data/, \\#recycle/,","depth":26,"role_description":"text"},{"role":"AXButton","text":"@eaDir/","depth":26,"help_text":"Open eaDir/","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"app_settings.json, app/.env\n __pycache__/, *.pyc, .DS_Store\n ```\n\n4. Errors and Fixes:\n\n- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\\#recycle/`. Also had to `git rm --cached \"#recycle/desktop.ini\"` to unstage it.\n- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.\n- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.\n- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.\n- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.\n\n5. Problem Solving:\n\n- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.\n- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.\n- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).\n- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.\n\n6. All User Messages:\n\n- \"do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps.\"\n- \"doi I need to restart?\"\n- \"there is sudo docker compose\"\n- \"no still the same\"\n- \"add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git\"\n- \"just do it\" (re: git push)\n- \"how to make sure data in :8767 are accurate and point to archive.db\"\n- \"I can't see older than 16th there should 21st of april. In http://192.168.0.242:8766/ I can see all but not on sqlite viewer http://192.168.0.242:8767\"\n- \"ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive\"\n- [docker compose output showing orphan container error]\n- \"looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast\"\n- \"lets make the playing speed more than 8x\"\n- \"still playing speed is not showing properly still just in one second. also I want to see in timeline where I am\"\n\n7. Pending Tasks:\n\n- **Playback speed fix** (in progress, partially done):\n - Add `<div class=\"tt-playhead-time\" id=\"ttPlayheadTime\"></div>` inside `ttInner` HTML\n - Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions\n - Update speed select `onchange` to call `ttSetSpeed(+this.value)`\n - Add 64× option to speed select\n - Update `_ttMovePlayhead` to also update `ttPlayheadTime` label\n - Update `ttSyncBtn` to start/stop timer based on play state + speed\n - Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)\n - Rebuild Docker image after changes\n\n8. Current Work:\n\nWorking on fixing two issues with the Timetable tab:\n1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.\n2. **Timeline position indicator**: Playhead not prominent enough. \n\n**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:\n```css\n.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n```\n\nSession was interrupted by summary request after this CSS edit, mid-implementation.\n\n9. Optional Next Step:\n\nContinuing the fix for: \"still playing speed is not showing properly still just in one second. also I want to see in timeline where I am\"\n\nThe next steps in order are:\n1. Add `<div class=\"tt-playhead-time\" id=\"ttPlayheadTime\"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)\n2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`\n3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)\n4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option\n5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer\n6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`\n\nIf you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl\nContinue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with \"I'll continue\" or similar. Pick up the last task as if the break never happened.","depth":26,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find timetable speed and playhead related code","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"tt-playhead\\|ttPlayhead\\|ttInner\\|_ttMovePlayhead\\|ttSetSpeed\\|_ttStartSpeed\\|_ttStopSpeed\\|ttSyncBtn\\|playbackRate\\|speed.*select\\|spdSel\\|ttSpeed\" /volume1/screenpipe/app/static/index.html | head -80","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n580: <div class=\"tt-inner\" id=\"ttInner\" onclick=\"ttTimelineClick(event)\">\n583: <div class=\"tt-playhead\" id=\"ttPlayhead\"></div>\n598: onpause=\"ttSyncBtn()\"\n599: onplay=\"ttSyncBtn()\">\n607: <select id=\"ttSpeed\" onchange=\"document.getElementById('ttVideo').playbackRate=+this.value\">\n1624: document.getElementById('ttInner').style.width = '100%';\n1632: document.getElementById('ttPlayhead').style.display = 'none';\n1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';\n1700: const inner = document.getElementById('ttInner');\n1710: const inner = document.getElementById('ttInner');\n1718: const inner = document.getElementById('ttInner');\n1750: _ttMovePlayhead(new Date(best.ts).getTime());\n1772: _ttMovePlayhead(new Date(best.ts).getTime());\n1791:function _ttMovePlayhead(tsMs) {\n1792: const ph = document.getElementById('ttPlayhead');\n1802: const ph = document.getElementById('ttPlayhead');\n1805: const inner = document.getElementById('ttInner');\n1819:function ttSyncBtn() {","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 576-625)","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1786-1865)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find chunk loading and playhead update functions","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"ttUpdatePlayhead\\|ttNextChunk\\|ttLoadChunk\\|_ttCurChunk\\|_ttChunks\\|_ttFrames\" /volume1/screenpipe/app/static/index.html | head -50","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"596: onended=\"ttNextChunk()\"\n597: ontimeupdate=\"ttUpdatePlayhead()\"\n1569:let _ttFrames = [];\n1570:let _ttChunks = [];\n1571:let _ttCurChunk = -1;\n1607: _ttFrames = data.frames;\n1609: for (const f of _ttFrames) {\n1613: _ttChunks = [...chunkMap.values()];\n1614: _ttCurChunk = -1;\n1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();\n1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();\n1620: for (const f of _ttFrames) _ttColor(f.app);\n1640: for (const f of _ttFrames) {\n1736: if (!_ttFrames.length) return;\n1737: let best = _ttFrames[0], minDiff = Infinity;\n1738: for (const f of _ttFrames) {\n1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);\n1744: _ttCurChunk = ci;\n1753:function ttNextChunk() {\n1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;\n1755: _ttCurChunk++;\n1757: video.src = _ttChunks[_ttCurChunk][0].video_url;\n1762:function ttUpdatePlayhead() {\n1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;\n1765: const chunk = _ttChunks[_ttCurChunk];","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1754-1793)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1701-1760)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1561-1640)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find time formatting functions","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"function fmtTime\\|function fmtDate\\|function _fmt\\|localTimeToUtc\\|fmtDateTime\" /volume1/screenpipe/app/static/index.html | head -20","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"1088: if (tf) url += `&time_from=${localTimeToUtc(tf)}`;\n1089: if (tt) url += `&time_to=${localTimeToUtc(tt)}`;\n1153: let meta = `<span style=\"color:var(--muted)\">${fmtDateTime(r.timestamp)}</span>${srcBadge}`;\n1166: meta = `<span style=\"color:var(--muted)\">${fmtDateTime(r.timestamp)}</span>${srcBadge} <span class=\"badge ${r.is_input_device?'mic':'sys'}\">${r.is_input_device?'MIC':'SYS'}</span>`;\n1307:function fmtTime(ts) {\n1312:function fmtDateTime(ts) {\n1320:function localTimeToUtc(timeStr) {\n1778:function _fmtSec(s) {\n1788: `${fmtDateTime(f.ts)} · ${f.app}${f.win ? ' / ' + f.win : ''}`;","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1308-1327)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Now I have everything I need. I'll implement the frame-by-frame timer system that replaces","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"video.playbackRate","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"with wall-clock accurate playback, plus add the playhead time label. Let me make the changes:","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Edit","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Added 1 line","depth":24,"role_description":"text"}]...
|
7813567583120146056
|
4474475550963076503
|
click
|
accessibility
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G) - 2 pending changes
2
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: nas]
Explorer Section: screenpipe [SSH: nas]
SCREENPIPE [SSH: NAS]
#recycle
app
data
pipes
.gitignore
app_settings.json
archive.db
db.sqlite
screenpipe_sync.sh
screenpipe.db
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
app_settings.json, Editor Group 1
screenpipe_sync.sh, Editor Group 1
db.sqlite-shm, preview, Editor Group 1
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lets add ability to jump…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: nas
SSH: nas
screenpipe (Git) - master*, Checkout Branch/Tag...
master*
screenpipe (Git) - Synchronize Changes
No Problems
0
0
No Ports Forwarded
0
Notifications
Signed out
Signed out
Shell Script
Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions
LF
UTF-8
Spaces: 2
Ln 331, Col 48
Screen Reader Optimized
git-commit Lukas Kovalik (23 hours ago)
Lukas Kovalik (23 hours ago)
Info: Downloading VS Code Server...
lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time
Session history
New session
Message actions
This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.
Summary:
1. Primary Request and Intent:
The user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:
- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.
- **Q2**: AND combination search (term1 + term2 must both appear) → Added "AND also" input field.
- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.
- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.
- **Q5**: "still the same" (container not picking up config) → Explained `up -d` vs `restart`.
- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.
- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.
- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.
- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.
2. Key Technical Concepts:
- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.
- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.
- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.
- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.
- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.
- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.
- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.
- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.
- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.
- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.
- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\#recycle/`.
3. Files and Code Sections:
- **`/volume1/screenpipe/app/main.py`**
- Added `/api/apps` endpoint (all unique app names from frames table)
- Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)
- `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: "..."}`
- Key snippet:
```python
@app.get("/api/timetable"
)
async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):
...
rows = conn.execute(f"""
SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,
f.offset_index, f.snapshot_path,
vc.file_path AS video_path, vc.fps AS video_fps
FROM frames f
JOIN video_chunks vc ON f.video_chunk_id = vc.id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND f.video_chunk_id IS NOT NULL {dev_clause}
ORDER BY f.timestamp
""", params).fetchall()
# seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)
```
- **`/volume1/screenpipe/app/docker-compose.yml`**
- Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`
- Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`
- screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`
- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)
- **Search enhancements**:
- Added `id="sq2"` "AND also" input between search-row1 and search-row2
- Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id="msOnlyApps"`, `id="msSkipApps"`)
- Updated `buildUrl()` to combine `q + " " + q2` and convert times with `localTimeToUtc()`
- Added `fmtDateTime(ts)` showing "Apr 20 14:08" format
- Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC
- Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`
- **Timetable tab** (new page):
- Tab button added between Work Report and AI Summary
- `showPage` array updated: `['activity','search','audio','report','timetable','summary']`
- `refresh()` calls `loadTimetable()` when on timetable page
- **Timetable CSS** (key styles):
```css
.tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }
.tt-inner { position:relative; height:52px; } /* width set dynamically */
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
.tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }
.tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }
```
- **Timetable JS state variables**:
```javascript
let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;
let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;
const _ttAppColors = {};
const TT_ZOOMS = [1, 2, 4, 8, 16, 32];
const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};
```
- **Key JS functions**:
- `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders
- `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead
- `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)
- `ttOverviewClick(e)` — scrolls timeline + seeks video
- `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`
- `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`
- `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video
- `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked
- `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`
- `_ttShowNow(f)` — updates screenshot thumbnail + now-text div
- `ttSyncBtn()` — syncs play/pause button text
- Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom
- **`/volume1/screenpipe/.gitignore`**
```
*.db, *.sqlite, *.sqlite-shm, *.sqlite-wal
data/, \#recycle/,
@eaDir/
app_settings.json, app/.env
__pycache__/, *.pyc, .DS_Store
```
4. Errors and Fixes:
- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\#recycle/`. Also had to `git rm --cached "#recycle/desktop.ini"` to unstage it.
- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.
- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.
- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.
- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.
5. Problem Solving:
- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.
- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.
- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).
- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.
6. All User Messages:
- "do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps."
- "doi I need to restart?"
- "there is sudo docker compose"
- "no still the same"
- "add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git"
- "just do it" (re: git push)
- "how to make sure data in :8767 are accurate and point to archive.db"
- "I can't see older than 16th there should 21st of april. In http://[IP_ADDRESS]:8766/ I can see all but not on sqlite viewer http://[IP_ADDRESS]:8767"
- "ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive"
- [docker compose output showing orphan container error]
- "looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast"
- "lets make the playing speed more than 8x"
- "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
7. Pending Tasks:
- **Playback speed fix** (in progress, partially done):
- Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` inside `ttInner` HTML
- Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions
- Update speed select `onchange` to call `ttSetSpeed(+this.value)`
- Add 64× option to speed select
- Update `_ttMovePlayhead` to also update `ttPlayheadTime` label
- Update `ttSyncBtn` to start/stop timer based on play state + speed
- Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)
- Rebuild Docker image after changes
8. Current Work:
Working on fixing two issues with the Timetable tab:
1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.
2. **Timeline position indicator**: Playhead not prominent enough.
**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:
```css
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
```
Session was interrupted by summary request after this CSS edit, mid-implementation.
9. Optional Next Step:
Continuing the fix for: "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
The next steps in order are:
1. Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)
2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`
3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)
4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option
5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer
6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`
If you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl
Continue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with "I'll continue" or similar. Pick up the last task as if the break never happened.
Thinking
Thinking
Bash
Find timetable speed and playhead related code
IN
grep -n "tt-playhead\|ttPlayhead\|ttInner\|_ttMovePlayhead\|ttSetSpeed\|_ttStartSpeed\|_ttStopSpeed\|ttSyncBtn\|playbackRate\|speed.*select\|spdSel\|ttSpeed" /volume1/screenpipe/app/static/index.html | head -80
Copy code to clipboard
OUT
207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
580: <div class="tt-inner" id="ttInner" onclick="ttTimelineClick(event)">
583: <div class="tt-playhead" id="ttPlayhead"></div>
598: onpause="ttSyncBtn()"
599: onplay="ttSyncBtn()">
607: <select id="ttSpeed" onchange="document.getElementById('ttVideo').playbackRate=+this.value">
1624: document.getElementById('ttInner').style.width = '100%';
1632: document.getElementById('ttPlayhead').style.display = 'none';
1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';
1700: const inner = document.getElementById('ttInner');
1710: const inner = document.getElementById('ttInner');
1718: const inner = document.getElementById('ttInner');
1750: _ttMovePlayhead(new Date(best.ts).getTime());
1772: _ttMovePlayhead(new Date(best.ts).getTime());
1791:function _ttMovePlayhead(tsMs) {
1792: const ph = document.getElementById('ttPlayhead');
1802: const ph = document.getElementById('ttPlayhead');
1805: const inner = document.getElementById('ttInner');
1819:function ttSyncBtn() {
Read
index.html
index.html
(lines 576-625)
Read
index.html
index.html
(lines 1786-1865)
Thinking
Thinking
Bash
Find chunk loading and playhead update functions
IN
grep -n "ttUpdatePlayhead\|ttNextChunk\|ttLoadChunk\|_ttCurChunk\|_ttChunks\|_ttFrames" /volume1/screenpipe/app/static/index.html | head -50
Copy code to clipboard
OUT
596: onended="ttNextChunk()"
597: ontimeupdate="ttUpdatePlayhead()"
1569:let _ttFrames = [];
1570:let _ttChunks = [];
1571:let _ttCurChunk = -1;
1607: _ttFrames = data.frames;
1609: for (const f of _ttFrames) {
1613: _ttChunks = [...chunkMap.values()];
1614: _ttCurChunk = -1;
1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();
1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();
1620: for (const f of _ttFrames) _ttColor(f.app);
1640: for (const f of _ttFrames) {
1736: if (!_ttFrames.length) return;
1737: let best = _ttFrames[0], minDiff = Infinity;
1738: for (const f of _ttFrames) {
1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);
1744: _ttCurChunk = ci;
1753:function ttNextChunk() {
1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;
1755: _ttCurChunk++;
1757: video.src = _ttChunks[_ttCurChunk][0].video_url;
1762:function ttUpdatePlayhead() {
1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;
1765: const chunk = _ttChunks[_ttCurChunk];
Read
index.html
index.html
(lines 1754-1793)
Thinking
Thinking
Read
index.html
index.html
(lines 1701-1760)
Thinking
Thinking
Read
index.html
index.html
(lines 1561-1640)
Thinking
Thinking
Bash
Find time formatting functions
IN
grep -n "function fmtTime\|function fmtDate\|function _fmt\|localTimeToUtc\|fmtDateTime" /volume1/screenpipe/app/static/index.html | head -20
Copy code to clipboard
OUT
1088: if (tf) url += `&time_from=${localTimeToUtc(tf)}`;
1089: if (tt) url += `&time_to=${localTimeToUtc(tt)}`;
1153: let meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge}`;
1166: meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge} <span class="badge ${r.is_input_device?'mic':'sys'}">${r.is_input_device?'MIC':'SYS'}</span>`;
1307:function fmtTime(ts) {
1312:function fmtDateTime(ts) {
1320:function localTimeToUtc(timeStr) {
1778:function _fmtSec(s) {
1788: `${fmtDateTime(f.ts)} · ${f.app}${f.win ? ' / ' + f.win : ''}`;
Read
index.html
index.html
(lines 1308-1327)
Thinking
Thinking
Now I have everything I need. I'll implement the frame-by-frame timer system that replaces
video.playbackRate
with wall-clock accurate playback, plus add the playhead time label. Let me make the changes:
Edit
index.html
index.html
Added 1 line...
|
NULL
|
NULL
|
|
81023
|
2156
|
7
|
2026-04-25T15:56:19.227318+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-25/1777 /Users/lukas/.screenpipe/data/data/2026-04-25/1777132579227_m1.jpg...
|
Code
|
screenpipe_sync.sh — screenpipe [SSH: nas]
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G) - 2 pending changes
2
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: nas]
Explorer Section: screenpipe [SSH: nas]
SCREENPIPE [SSH: NAS]
#recycle
app
data
pipes
.gitignore
app_settings.json
archive.db
db.sqlite
screenpipe_sync.sh
screenpipe.db
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
app_settings.json, Editor Group 1
screenpipe_sync.sh, Editor Group 1
db.sqlite-shm, preview, Editor Group 1
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lets add ability to jump…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: nas
SSH: nas
screenpipe (Git) - master*, Checkout Branch/Tag...
master*
screenpipe (Git) - Synchronize Changes
No Problems
0
0
No Ports Forwarded
0
Notifications
Signed out
Signed out
Shell Script
Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions
LF
UTF-8
Spaces: 2
Ln 331, Col 48
Screen Reader Optimized
git-commit Lukas Kovalik (23 hours ago)
Lukas Kovalik (23 hours ago)
Info: Downloading VS Code Server...
lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time
Session history
New session
Message actions
This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.
Summary:
1. Primary Request and Intent:
The user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:
- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.
- **Q2**: AND combination search (term1 + term2 must both appear) → Added "AND also" input field.
- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.
- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.
- **Q5**: "still the same" (container not picking up config) → Explained `up -d` vs `restart`.
- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.
- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.
- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.
- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.
2. Key Technical Concepts:
- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.
- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.
- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.
- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.
- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.
- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.
- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.
- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.
- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.
- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.
- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\#recycle/`.
3. Files and Code Sections:
- **`/volume1/screenpipe/app/main.py`**
- Added `/api/apps` endpoint (all unique app names from frames table)
- Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)
- `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: "..."}`
- Key snippet:
```python
@app.get("/api/timetable"
)
async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):
...
rows = conn.execute(f"""
SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,
f.offset_index, f.snapshot_path,
vc.file_path AS video_path, vc.fps AS video_fps
FROM frames f
JOIN video_chunks vc ON f.video_chunk_id = vc.id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND f.video_chunk_id IS NOT NULL {dev_clause}
ORDER BY f.timestamp
""", params).fetchall()
# seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)
```
- **`/volume1/screenpipe/app/docker-compose.yml`**
- Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`
- Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`
- screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`
- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)
- **Search enhancements**:
- Added `id="sq2"` "AND also" input between search-row1 and search-row2
- Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id="msOnlyApps"`, `id="msSkipApps"`)
- Updated `buildUrl()` to combine `q + " " + q2` and convert times with `localTimeToUtc()`
- Added `fmtDateTime(ts)` showing "Apr 20 14:08" format
- Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC
- Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`
- **Timetable tab** (new page):
- Tab button added between Work Report and AI Summary
- `showPage` array updated: `['activity','search','audio','report','timetable','summary']`
- `refresh()` calls `loadTimetable()` when on timetable page
- **Timetable CSS** (key styles):
```css
.tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }
.tt-inner { position:relative; height:52px; } /* width set dynamically */
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
.tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }
.tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }
```
- **Timetable JS state variables**:
```javascript
let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;
let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;
const _ttAppColors = {};
const TT_ZOOMS = [1, 2, 4, 8, 16, 32];
const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};
```
- **Key JS functions**:
- `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders
- `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead
- `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)
- `ttOverviewClick(e)` — scrolls timeline + seeks video
- `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`
- `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`
- `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video
- `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked
- `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`
- `_ttShowNow(f)` — updates screenshot thumbnail + now-text div
- `ttSyncBtn()` — syncs play/pause button text
- Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom
- **`/volume1/screenpipe/.gitignore`**
```
*.db, *.sqlite, *.sqlite-shm, *.sqlite-wal
data/, \#recycle/,
@eaDir/
app_settings.json, app/.env
__pycache__/, *.pyc, .DS_Store
```
4. Errors and Fixes:
- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\#recycle/`. Also had to `git rm --cached "#recycle/desktop.ini"` to unstage it.
- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.
- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.
- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.
- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.
5. Problem Solving:
- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.
- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.
- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).
- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.
6. All User Messages:
- "do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps."
- "doi I need to restart?"
- "there is sudo docker compose"
- "no still the same"
- "add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git"
- "just do it" (re: git push)
- "how to make sure data in :8767 are accurate and point to archive.db"
- "I can't see older than 16th there should 21st of april. In http://[IP_ADDRESS]:8766/ I can see all but not on sqlite viewer http://[IP_ADDRESS]:8767"
- "ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive"
- [docker compose output showing orphan container error]
- "looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast"
- "lets make the playing speed more than 8x"
- "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
7. Pending Tasks:
- **Playback speed fix** (in progress, partially done):
- Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` inside `ttInner` HTML
- Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions
- Update speed select `onchange` to call `ttSetSpeed(+this.value)`
- Add 64× option to speed select
- Update `_ttMovePlayhead` to also update `ttPlayheadTime` label
- Update `ttSyncBtn` to start/stop timer based on play state + speed
- Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)
- Rebuild Docker image after changes
8. Current Work:
Working on fixing two issues with the Timetable tab:
1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.
2. **Timeline position indicator**: Playhead not prominent enough.
**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:
```css
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
```
Session was interrupted by summary request after this CSS edit, mid-implementation.
9. Optional Next Step:
Continuing the fix for: "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
The next steps in order are:
1. Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)
2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`
3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)
4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option
5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer
6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`
If you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl
Continue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with "I'll continue" or similar. Pick up the last task as if the break never happened.
Thinking
Thinking
Bash
Find timetable speed and playhead related code
IN
grep -n "tt-playhead\|ttPlayhead\|ttInner\|_ttMovePlayhead\|ttSetSpeed\|_ttStartSpeed\|_ttStopSpeed\|ttSyncBtn\|playbackRate\|speed.*select\|spdSel\|ttSpeed" /volume1/screenpipe/app/static/index.html | head -80
Copy code to clipboard
OUT
207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
580: <div class="tt-inner" id="ttInner" onclick="ttTimelineClick(event)">
583: <div class="tt-playhead" id="ttPlayhead"></div>
598: onpause="ttSyncBtn()"
599: onplay="ttSyncBtn()">
607: <select id="ttSpeed" onchange="document.getElementById('ttVideo').playbackRate=+this.value">
1624: document.getElementById('ttInner').style.width = '100%';
1632: document.getElementById('ttPlayhead').style.display = 'none';
1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';
1700: const inner = document.getElementById('ttInner');
1710: const inner = document.getElementById('ttInner');
1718: const inner = document.getElementById('ttInner');
1750: _ttMovePlayhead(new Date(best.ts).getTime());
1772: _ttMovePlayhead(new Date(best.ts).getTime());
1791:function _ttMovePlayhead(tsMs) {
1792: const ph = document.getElementById('ttPlayhead');
1802: const ph = document.getElementById('ttPlayhead');
1805: const inner = document.getElementById('ttInner');
1819:function ttSyncBtn() {
Read
index.html
index.html
(lines 576-625)
Read
index.html
index.html
(lines 1786-1865)
Thinking
Thinking
Bash
Find chunk loading and playhead update functions
IN
grep -n "ttUpdatePlayhead\|ttNextChunk\|ttLoadChunk\|_ttCurChunk\|_ttChunks\|_ttFrames" /volume1/screenpipe/app/static/index.html | head -50
Copy code to clipboard
OUT
596: onended="ttNextChunk()"
597: ontimeupdate="ttUpdatePlayhead()"
1569:let _ttFrames = [];
1570:let _ttChunks = [];
1571:let _ttCurChunk = -1;
1607: _ttFrames = data.frames;
1609: for (const f of _ttFrames) {
1613: _ttChunks = [...chunkMap.values()];
1614: _ttCurChunk = -1;
1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();
1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();
1620: for (const f of _ttFrames) _ttColor(f.app);
1640: for (const f of _ttFrames) {
1736: if (!_ttFrames.length) return;
1737: let best = _ttFrames[0], minDiff = Infinity;
1738: for (const f of _ttFrames) {
1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);
1744: _ttCurChunk = ci;
1753:function ttNextChunk() {
1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;
1755: _ttCurChunk++;
1757: video.src = _ttChunks[_ttCurChunk][0].video_url;
1762:function ttUpdatePlayhead() {
1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;
1765: const chunk = _ttChunks[_ttCurChunk];
Read
index.html
index.html
(lines 1754-1793)
Thinking
Thinking
Read
index.html
index.html
(lines 1701-1760)
Thinking
Thinking
Read
index.html
index.html
(lines 1561-1640)
Thinking
Thinking
Bash
Find time formatting functions
IN
grep -n "function fmtTime\|function fmtDate\|function _fmt\|localTimeToUtc\|fmtDateTime" /volume1/screenpipe/app/static/index.html | head -20
Copy code to clipboard
OUT
1088: if (tf) url += `&time_from=${localTimeToUtc(tf)}`;
1089: if (tt) url += `&time_to=${localTimeToUtc(tt)}`;
1153: let meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge}`;
1166: meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge} <span class="badge ${r.is_input_device?'mic':'sys'}">${r.is_input_device?'MIC':'SYS'}</span>`;
1307:function fmtTime(ts) {
1312:function fmtDateTime(ts) {
1320:function localTimeToUtc(timeStr) {
1778:function _fmtSec(s) {
1788: `${fmtDateTime(f.ts)} · ${f.app}${f.win ? ' / ' + f.win : ''}`;
Read
index.html
index.html
(lines 1308-1327)
Thinking
Thinking
Now I have everything I need. I'll implement the frame-by-frame timer system that replaces
video.playbackRate
with wall-clock accurate playback, plus add the playhead time label. Let me make the changes:
Edit
index.html
index.html
Added 1 line...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Explorer (⇧⌘E)","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"","depth":22,"role_description":"text"},{"role":"AXRadioButton","text":"Search (⇧⌘F)","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"role_description":"text"},{"role":"AXRadioButton","text":"Source Control (⌃⇧G) - 2 pending changes","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":22,"role_description":"text"},{"role":"AXRadioButton","text":"Run and Debug (⇧⌘D)","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"role_description":"text"},{"role":"AXRadioButton","text":"Remote Explorer","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"role_description":"text"},{"role":"AXRadioButton","text":"Extensions (⇧⌘X) - 2 require update, 1 requires restart","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":22,"role_description":"text"},{"role":"AXRadioButton","text":"Claude Code","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"Containers","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"EXPLORER","depth":17,"role_description":"heading"},{"role":"AXStaticText","text":"EXPLORER","depth":18,"role_description":"text"},{"role":"AXButton","text":"Explorer Section: screenpipe [SSH: nas]","depth":21,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXHeading","text":"Explorer Section: screenpipe [SSH: nas]","depth":22,"role_description":"heading"},{"role":"AXStaticText","text":"SCREENPIPE [SSH: NAS]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"#recycle","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"app","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"data","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"pipes","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":".gitignore","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"app_settings.json","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"archive.db","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"db.sqlite","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"screenpipe_sync.sh","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"screenpipe.db","depth":27,"role_description":"text"},{"role":"AXButton","text":"Outline Section","depth":21,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXHeading","text":"OUTLINE","depth":22,"role_description":"heading"},{"role":"AXStaticText","text":"OUTLINE","depth":23,"role_description":"text"},{"role":"AXButton","text":"Timeline Section","depth":21,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXHeading","text":"TIMELINE","depth":22,"role_description":"heading"},{"role":"AXStaticText","text":"TIMELINE","depth":23,"role_description":"text"},{"role":"AXRadioButton","text":"app_settings.json, Editor Group 1","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe_sync.sh, Editor Group 1","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":"db.sqlite-shm, preview, Editor Group 1","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/Test/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","depth":28,"value":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/Test/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","role_description":"editor","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/Test/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","depth":29,"role_description":"text"},{"role":"AXRadioButton","text":"lets add ability to jump…, Editor Group 2","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":"Problems (⇧⌘M)","depth":22,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PROBLEMS","depth":24,"role_description":"text"},{"role":"AXRadioButton","text":"Output (⇧⌘U)","depth":22,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUTPUT","depth":24,"role_description":"text"},{"role":"AXRadioButton","text":"Debug Console (⇧⌘Y)","depth":22,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"DEBUG CONSOLE","depth":24,"role_description":"text"},{"role":"AXRadioButton","text":"Terminal (⌃`)","depth":22,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"TERMINAL","depth":24,"role_description":"text"},{"role":"AXRadioButton","text":"Ports","depth":22,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PORTS","depth":24,"role_description":"text"},{"role":"AXButton","text":"remote SSH: nas","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"SSH: nas","depth":17,"role_description":"text"},{"role":"AXButton","text":"screenpipe (Git) - master*, Checkout Branch/Tag...","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"master*","depth":17,"role_description":"text"},{"role":"AXButton","text":"screenpipe (Git) - Synchronize Changes","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"No Problems","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"role_description":"text"},{"role":"AXButton","text":"No Ports Forwarded","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"role_description":"text"},{"role":"AXButton","text":"Notifications","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Signed out","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"Signed out","depth":17,"role_description":"text"},{"role":"AXButton","text":"Shell Script","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"LF","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"UTF-8","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Spaces: 2","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Ln 331, Col 48","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Screen Reader Optimized","depth":16,"bounds":{"left":1.0,"top":0.0,"width":-0.07500005,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"git-commit Lukas Kovalik (23 hours ago)","depth":16,"bounds":{"left":0.9388889,"top":0.0,"width":0.061111093,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.9423611,"top":0.0,"width":0.011805556,"height":0.017777778},"role_description":"text"},{"role":"AXStaticText","text":"Lukas Kovalik (23 hours ago)","depth":17,"bounds":{"left":0.9534722,"top":0.0,"width":0.046527803,"height":0.015555556},"role_description":"text"},{"role":"AXStaticText","text":"Info: Downloading VS Code Server...","depth":12,"role_description":"text"},{"role":"AXButton","text":"lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time","depth":19,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Session history","depth":19,"help_text":"Session history","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New session","depth":19,"help_text":"New session","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Message actions","depth":24,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.\n\nSummary:\n1. Primary Request and Intent:\n\nThe user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:\n- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.\n- **Q2**: AND combination search (term1 + term2 must both appear) → Added \"AND also\" input field.\n- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.\n- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.\n- **Q5**: \"still the same\" (container not picking up config) → Explained `up -d` vs `restart`.\n- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.\n- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.\n- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.\n- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.\n\n2. Key Technical Concepts:\n\n- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.\n- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.\n- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.\n- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.\n- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.\n- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.\n- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.\n- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.\n- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.\n- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.\n- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\\#recycle/`.\n\n3. Files and Code Sections:\n\n- **`/volume1/screenpipe/app/main.py`**\n - Added `/api/apps` endpoint (all unique app names from frames table)\n - Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)\n - `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: \"...\"}`\n - Key snippet:\n ```python","depth":26,"role_description":"text"},{"role":"AXButton","text":"@app.get(\"/api/timetable\"","depth":26,"help_text":"Open app.get(\"/api/timetable\"","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":")\n async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):\n ...\n rows = conn.execute(f\"\"\"\n SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,\n f.offset_index, f.snapshot_path,\n vc.file_path AS video_path, vc.fps AS video_fps\n FROM frames f\n JOIN video_chunks vc ON f.video_chunk_id = vc.id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND f.video_chunk_id IS NOT NULL {dev_clause}\n ORDER BY f.timestamp\n \"\"\", params).fetchall()\n # seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)\n ```\n\n- **`/volume1/screenpipe/app/docker-compose.yml`**\n - Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`\n - Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`\n - screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`\n\n- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)\n - **Search enhancements**:\n - Added `id=\"sq2\"` \"AND also\" input between search-row1 and search-row2\n - Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id=\"msOnlyApps\"`, `id=\"msSkipApps\"`)\n - Updated `buildUrl()` to combine `q + \" \" + q2` and convert times with `localTimeToUtc()`\n - Added `fmtDateTime(ts)` showing \"Apr 20 14:08\" format\n - Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC\n - Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`\n - **Timetable tab** (new page):\n - Tab button added between Work Report and AI Summary\n - `showPage` array updated: `['activity','search','audio','report','timetable','summary']`\n - `refresh()` calls `loadTimetable()` when on timetable page\n - **Timetable CSS** (key styles):\n ```css\n .tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }\n .tt-inner { position:relative; height:52px; } /* width set dynamically */\n .tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n .tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n .tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }\n .tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }\n ```\n - **Timetable JS state variables**:\n ```javascript\n let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;\n let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;\n const _ttAppColors = {};\n const TT_ZOOMS = [1, 2, 4, 8, 16, 32];\n const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};\n ```\n - **Key JS functions**:\n - `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders\n - `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead\n - `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)\n - `ttOverviewClick(e)` — scrolls timeline + seeks video\n - `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`\n - `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`\n - `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video\n - `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked\n - `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`\n - `_ttShowNow(f)` — updates screenshot thumbnail + now-text div\n - `ttSyncBtn()` — syncs play/pause button text\n - Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom\n\n- **`/volume1/screenpipe/.gitignore`**\n ```\n *.db, *.sqlite, *.sqlite-shm, *.sqlite-wal\n data/, \\#recycle/,","depth":26,"role_description":"text"},{"role":"AXButton","text":"@eaDir/","depth":26,"help_text":"Open eaDir/","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"app_settings.json, app/.env\n __pycache__/, *.pyc, .DS_Store\n ```\n\n4. Errors and Fixes:\n\n- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\\#recycle/`. Also had to `git rm --cached \"#recycle/desktop.ini\"` to unstage it.\n- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.\n- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.\n- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.\n- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.\n\n5. Problem Solving:\n\n- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.\n- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.\n- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).\n- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.\n\n6. All User Messages:\n\n- \"do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps.\"\n- \"doi I need to restart?\"\n- \"there is sudo docker compose\"\n- \"no still the same\"\n- \"add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git\"\n- \"just do it\" (re: git push)\n- \"how to make sure data in :8767 are accurate and point to archive.db\"\n- \"I can't see older than 16th there should 21st of april. In http://192.168.0.242:8766/ I can see all but not on sqlite viewer http://192.168.0.242:8767\"\n- \"ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive\"\n- [docker compose output showing orphan container error]\n- \"looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast\"\n- \"lets make the playing speed more than 8x\"\n- \"still playing speed is not showing properly still just in one second. also I want to see in timeline where I am\"\n\n7. Pending Tasks:\n\n- **Playback speed fix** (in progress, partially done):\n - Add `<div class=\"tt-playhead-time\" id=\"ttPlayheadTime\"></div>` inside `ttInner` HTML\n - Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions\n - Update speed select `onchange` to call `ttSetSpeed(+this.value)`\n - Add 64× option to speed select\n - Update `_ttMovePlayhead` to also update `ttPlayheadTime` label\n - Update `ttSyncBtn` to start/stop timer based on play state + speed\n - Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)\n - Rebuild Docker image after changes\n\n8. Current Work:\n\nWorking on fixing two issues with the Timetable tab:\n1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.\n2. **Timeline position indicator**: Playhead not prominent enough. \n\n**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:\n```css\n.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n```\n\nSession was interrupted by summary request after this CSS edit, mid-implementation.\n\n9. Optional Next Step:\n\nContinuing the fix for: \"still playing speed is not showing properly still just in one second. also I want to see in timeline where I am\"\n\nThe next steps in order are:\n1. Add `<div class=\"tt-playhead-time\" id=\"ttPlayheadTime\"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)\n2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`\n3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)\n4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option\n5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer\n6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`\n\nIf you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl\nContinue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with \"I'll continue\" or similar. Pick up the last task as if the break never happened.","depth":26,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find timetable speed and playhead related code","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"tt-playhead\\|ttPlayhead\\|ttInner\\|_ttMovePlayhead\\|ttSetSpeed\\|_ttStartSpeed\\|_ttStopSpeed\\|ttSyncBtn\\|playbackRate\\|speed.*select\\|spdSel\\|ttSpeed\" /volume1/screenpipe/app/static/index.html | head -80","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n580: <div class=\"tt-inner\" id=\"ttInner\" onclick=\"ttTimelineClick(event)\">\n583: <div class=\"tt-playhead\" id=\"ttPlayhead\"></div>\n598: onpause=\"ttSyncBtn()\"\n599: onplay=\"ttSyncBtn()\">\n607: <select id=\"ttSpeed\" onchange=\"document.getElementById('ttVideo').playbackRate=+this.value\">\n1624: document.getElementById('ttInner').style.width = '100%';\n1632: document.getElementById('ttPlayhead').style.display = 'none';\n1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';\n1700: const inner = document.getElementById('ttInner');\n1710: const inner = document.getElementById('ttInner');\n1718: const inner = document.getElementById('ttInner');\n1750: _ttMovePlayhead(new Date(best.ts).getTime());\n1772: _ttMovePlayhead(new Date(best.ts).getTime());\n1791:function _ttMovePlayhead(tsMs) {\n1792: const ph = document.getElementById('ttPlayhead');\n1802: const ph = document.getElementById('ttPlayhead');\n1805: const inner = document.getElementById('ttInner');\n1819:function ttSyncBtn() {","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 576-625)","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1786-1865)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find chunk loading and playhead update functions","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"ttUpdatePlayhead\\|ttNextChunk\\|ttLoadChunk\\|_ttCurChunk\\|_ttChunks\\|_ttFrames\" /volume1/screenpipe/app/static/index.html | head -50","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"596: onended=\"ttNextChunk()\"\n597: ontimeupdate=\"ttUpdatePlayhead()\"\n1569:let _ttFrames = [];\n1570:let _ttChunks = [];\n1571:let _ttCurChunk = -1;\n1607: _ttFrames = data.frames;\n1609: for (const f of _ttFrames) {\n1613: _ttChunks = [...chunkMap.values()];\n1614: _ttCurChunk = -1;\n1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();\n1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();\n1620: for (const f of _ttFrames) _ttColor(f.app);\n1640: for (const f of _ttFrames) {\n1736: if (!_ttFrames.length) return;\n1737: let best = _ttFrames[0], minDiff = Infinity;\n1738: for (const f of _ttFrames) {\n1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);\n1744: _ttCurChunk = ci;\n1753:function ttNextChunk() {\n1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;\n1755: _ttCurChunk++;\n1757: video.src = _ttChunks[_ttCurChunk][0].video_url;\n1762:function ttUpdatePlayhead() {\n1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;\n1765: const chunk = _ttChunks[_ttCurChunk];","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1754-1793)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1701-1760)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1561-1640)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find time formatting functions","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"function fmtTime\\|function fmtDate\\|function _fmt\\|localTimeToUtc\\|fmtDateTime\" /volume1/screenpipe/app/static/index.html | head -20","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"1088: if (tf) url += `&time_from=${localTimeToUtc(tf)}`;\n1089: if (tt) url += `&time_to=${localTimeToUtc(tt)}`;\n1153: let meta = `<span style=\"color:var(--muted)\">${fmtDateTime(r.timestamp)}</span>${srcBadge}`;\n1166: meta = `<span style=\"color:var(--muted)\">${fmtDateTime(r.timestamp)}</span>${srcBadge} <span class=\"badge ${r.is_input_device?'mic':'sys'}\">${r.is_input_device?'MIC':'SYS'}</span>`;\n1307:function fmtTime(ts) {\n1312:function fmtDateTime(ts) {\n1320:function localTimeToUtc(timeStr) {\n1778:function _fmtSec(s) {\n1788: `${fmtDateTime(f.ts)} · ${f.app}${f.win ? ' / ' + f.win : ''}`;","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1308-1327)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Now I have everything I need. I'll implement the frame-by-frame timer system that replaces","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"video.playbackRate","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"with wall-clock accurate playback, plus add the playhead time label. Let me make the changes:","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Edit","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Added 1 line","depth":24,"role_description":"text"}]...
|
7813567583120146056
|
4474475550963076503
|
click
|
accessibility
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G) - 2 pending changes
2
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: nas]
Explorer Section: screenpipe [SSH: nas]
SCREENPIPE [SSH: NAS]
#recycle
app
data
pipes
.gitignore
app_settings.json
archive.db
db.sqlite
screenpipe_sync.sh
screenpipe.db
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
app_settings.json, Editor Group 1
screenpipe_sync.sh, Editor Group 1
db.sqlite-shm, preview, Editor Group 1
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lets add ability to jump…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: nas
SSH: nas
screenpipe (Git) - master*, Checkout Branch/Tag...
master*
screenpipe (Git) - Synchronize Changes
No Problems
0
0
No Ports Forwarded
0
Notifications
Signed out
Signed out
Shell Script
Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions
LF
UTF-8
Spaces: 2
Ln 331, Col 48
Screen Reader Optimized
git-commit Lukas Kovalik (23 hours ago)
Lukas Kovalik (23 hours ago)
Info: Downloading VS Code Server...
lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time
Session history
New session
Message actions
This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.
Summary:
1. Primary Request and Intent:
The user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:
- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.
- **Q2**: AND combination search (term1 + term2 must both appear) → Added "AND also" input field.
- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.
- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.
- **Q5**: "still the same" (container not picking up config) → Explained `up -d` vs `restart`.
- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.
- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.
- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.
- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.
2. Key Technical Concepts:
- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.
- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.
- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.
- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.
- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.
- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.
- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.
- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.
- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.
- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.
- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\#recycle/`.
3. Files and Code Sections:
- **`/volume1/screenpipe/app/main.py`**
- Added `/api/apps` endpoint (all unique app names from frames table)
- Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)
- `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: "..."}`
- Key snippet:
```python
@app.get("/api/timetable"
)
async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):
...
rows = conn.execute(f"""
SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,
f.offset_index, f.snapshot_path,
vc.file_path AS video_path, vc.fps AS video_fps
FROM frames f
JOIN video_chunks vc ON f.video_chunk_id = vc.id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND f.video_chunk_id IS NOT NULL {dev_clause}
ORDER BY f.timestamp
""", params).fetchall()
# seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)
```
- **`/volume1/screenpipe/app/docker-compose.yml`**
- Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`
- Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`
- screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`
- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)
- **Search enhancements**:
- Added `id="sq2"` "AND also" input between search-row1 and search-row2
- Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id="msOnlyApps"`, `id="msSkipApps"`)
- Updated `buildUrl()` to combine `q + " " + q2` and convert times with `localTimeToUtc()`
- Added `fmtDateTime(ts)` showing "Apr 20 14:08" format
- Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC
- Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`
- **Timetable tab** (new page):
- Tab button added between Work Report and AI Summary
- `showPage` array updated: `['activity','search','audio','report','timetable','summary']`
- `refresh()` calls `loadTimetable()` when on timetable page
- **Timetable CSS** (key styles):
```css
.tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }
.tt-inner { position:relative; height:52px; } /* width set dynamically */
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
.tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }
.tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }
```
- **Timetable JS state variables**:
```javascript
let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;
let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;
const _ttAppColors = {};
const TT_ZOOMS = [1, 2, 4, 8, 16, 32];
const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};
```
- **Key JS functions**:
- `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders
- `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead
- `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)
- `ttOverviewClick(e)` — scrolls timeline + seeks video
- `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`
- `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`
- `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video
- `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked
- `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`
- `_ttShowNow(f)` — updates screenshot thumbnail + now-text div
- `ttSyncBtn()` — syncs play/pause button text
- Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom
- **`/volume1/screenpipe/.gitignore`**
```
*.db, *.sqlite, *.sqlite-shm, *.sqlite-wal
data/, \#recycle/,
@eaDir/
app_settings.json, app/.env
__pycache__/, *.pyc, .DS_Store
```
4. Errors and Fixes:
- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\#recycle/`. Also had to `git rm --cached "#recycle/desktop.ini"` to unstage it.
- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.
- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.
- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.
- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.
5. Problem Solving:
- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.
- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.
- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).
- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.
6. All User Messages:
- "do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps."
- "doi I need to restart?"
- "there is sudo docker compose"
- "no still the same"
- "add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git"
- "just do it" (re: git push)
- "how to make sure data in :8767 are accurate and point to archive.db"
- "I can't see older than 16th there should 21st of april. In http://[IP_ADDRESS]:8766/ I can see all but not on sqlite viewer http://[IP_ADDRESS]:8767"
- "ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive"
- [docker compose output showing orphan container error]
- "looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast"
- "lets make the playing speed more than 8x"
- "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
7. Pending Tasks:
- **Playback speed fix** (in progress, partially done):
- Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` inside `ttInner` HTML
- Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions
- Update speed select `onchange` to call `ttSetSpeed(+this.value)`
- Add 64× option to speed select
- Update `_ttMovePlayhead` to also update `ttPlayheadTime` label
- Update `ttSyncBtn` to start/stop timer based on play state + speed
- Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)
- Rebuild Docker image after changes
8. Current Work:
Working on fixing two issues with the Timetable tab:
1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.
2. **Timeline position indicator**: Playhead not prominent enough.
**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:
```css
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
```
Session was interrupted by summary request after this CSS edit, mid-implementation.
9. Optional Next Step:
Continuing the fix for: "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
The next steps in order are:
1. Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)
2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`
3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)
4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option
5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer
6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`
If you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl
Continue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with "I'll continue" or similar. Pick up the last task as if the break never happened.
Thinking
Thinking
Bash
Find timetable speed and playhead related code
IN
grep -n "tt-playhead\|ttPlayhead\|ttInner\|_ttMovePlayhead\|ttSetSpeed\|_ttStartSpeed\|_ttStopSpeed\|ttSyncBtn\|playbackRate\|speed.*select\|spdSel\|ttSpeed" /volume1/screenpipe/app/static/index.html | head -80
Copy code to clipboard
OUT
207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
580: <div class="tt-inner" id="ttInner" onclick="ttTimelineClick(event)">
583: <div class="tt-playhead" id="ttPlayhead"></div>
598: onpause="ttSyncBtn()"
599: onplay="ttSyncBtn()">
607: <select id="ttSpeed" onchange="document.getElementById('ttVideo').playbackRate=+this.value">
1624: document.getElementById('ttInner').style.width = '100%';
1632: document.getElementById('ttPlayhead').style.display = 'none';
1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';
1700: const inner = document.getElementById('ttInner');
1710: const inner = document.getElementById('ttInner');
1718: const inner = document.getElementById('ttInner');
1750: _ttMovePlayhead(new Date(best.ts).getTime());
1772: _ttMovePlayhead(new Date(best.ts).getTime());
1791:function _ttMovePlayhead(tsMs) {
1792: const ph = document.getElementById('ttPlayhead');
1802: const ph = document.getElementById('ttPlayhead');
1805: const inner = document.getElementById('ttInner');
1819:function ttSyncBtn() {
Read
index.html
index.html
(lines 576-625)
Read
index.html
index.html
(lines 1786-1865)
Thinking
Thinking
Bash
Find chunk loading and playhead update functions
IN
grep -n "ttUpdatePlayhead\|ttNextChunk\|ttLoadChunk\|_ttCurChunk\|_ttChunks\|_ttFrames" /volume1/screenpipe/app/static/index.html | head -50
Copy code to clipboard
OUT
596: onended="ttNextChunk()"
597: ontimeupdate="ttUpdatePlayhead()"
1569:let _ttFrames = [];
1570:let _ttChunks = [];
1571:let _ttCurChunk = -1;
1607: _ttFrames = data.frames;
1609: for (const f of _ttFrames) {
1613: _ttChunks = [...chunkMap.values()];
1614: _ttCurChunk = -1;
1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();
1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();
1620: for (const f of _ttFrames) _ttColor(f.app);
1640: for (const f of _ttFrames) {
1736: if (!_ttFrames.length) return;
1737: let best = _ttFrames[0], minDiff = Infinity;
1738: for (const f of _ttFrames) {
1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);
1744: _ttCurChunk = ci;
1753:function ttNextChunk() {
1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;
1755: _ttCurChunk++;
1757: video.src = _ttChunks[_ttCurChunk][0].video_url;
1762:function ttUpdatePlayhead() {
1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;
1765: const chunk = _ttChunks[_ttCurChunk];
Read
index.html
index.html
(lines 1754-1793)
Thinking
Thinking
Read
index.html
index.html
(lines 1701-1760)
Thinking
Thinking
Read
index.html
index.html
(lines 1561-1640)
Thinking
Thinking
Bash
Find time formatting functions
IN
grep -n "function fmtTime\|function fmtDate\|function _fmt\|localTimeToUtc\|fmtDateTime" /volume1/screenpipe/app/static/index.html | head -20
Copy code to clipboard
OUT
1088: if (tf) url += `&time_from=${localTimeToUtc(tf)}`;
1089: if (tt) url += `&time_to=${localTimeToUtc(tt)}`;
1153: let meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge}`;
1166: meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge} <span class="badge ${r.is_input_device?'mic':'sys'}">${r.is_input_device?'MIC':'SYS'}</span>`;
1307:function fmtTime(ts) {
1312:function fmtDateTime(ts) {
1320:function localTimeToUtc(timeStr) {
1778:function _fmtSec(s) {
1788: `${fmtDateTime(f.ts)} · ${f.app}${f.win ? ' / ' + f.win : ''}`;
Read
index.html
index.html
(lines 1308-1327)
Thinking
Thinking
Now I have everything I need. I'll implement the frame-by-frame timer system that replaces
video.playbackRate
with wall-clock accurate playback, plus add the playhead time label. Let me make the changes:
Edit
index.html
index.html
Added 1 line...
|
NULL
|
NULL
|
|
81024
|
2157
|
11
|
2026-04-25T15:56:20.668664+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-25/1777 /Users/lukas/.screenpipe/data/data/2026-04-25/1777132580668_m2.jpg...
|
Code
|
screenpipe_sync.sh — screenpipe [SSH: nas]
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G) - 2 pending changes
2
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: nas]
Explorer Section: screenpipe [SSH: nas]
SCREENPIPE [SSH: NAS]
#recycle
app
data
pipes
.gitignore
app_settings.json
archive.db
db.sqlite
screenpipe_sync.sh
screenpipe.db
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
app_settings.json, Editor Group 1
screenpipe_sync.sh, Editor Group 1
db.sqlite-shm, preview, Editor Group 1
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lets add ability to jump…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: nas
SSH: nas
screenpipe (Git) - master*, Checkout Branch/Tag...
master*
screenpipe (Git) - Synchronize Changes
No Problems
0
0
No Ports Forwarded
0
Notifications
Signed out
Signed out
Shell Script
Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions
LF
UTF-8
Spaces: 2
Ln 352, Col 47 (13096 selected)
Screen Reader Optimized
git-commit Lukas Kovalik (23 hours ago)
Lukas Kovalik (23 hours ago)
Info: Downloading VS Code Server...
lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time
Session history
New session
Message actions
This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.
Summary:
1. Primary Request and Intent:
The user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:
- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.
- **Q2**: AND combination search (term1 + term2 must both appear) → Added "AND also" input field.
- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.
- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.
- **Q5**: "still the same" (container not picking up config) → Explained `up -d` vs `restart`.
- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.
- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.
- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.
- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.
2. Key Technical Concepts:
- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.
- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.
- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.
- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.
- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.
- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.
- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.
- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.
- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.
- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.
- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\#recycle/`.
3. Files and Code Sections:
- **`/volume1/screenpipe/app/main.py`**
- Added `/api/apps` endpoint (all unique app names from frames table)
- Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)
- `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: "..."}`
- Key snippet:
```python
@app.get("/api/timetable"
)
async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):
...
rows = conn.execute(f"""
SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,
f.offset_index, f.snapshot_path,
vc.file_path AS video_path, vc.fps AS video_fps
FROM frames f
JOIN video_chunks vc ON f.video_chunk_id = vc.id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND f.video_chunk_id IS NOT NULL {dev_clause}
ORDER BY f.timestamp
""", params).fetchall()
# seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)
```
- **`/volume1/screenpipe/app/docker-compose.yml`**
- Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`
- Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`
- screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`
- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)
- **Search enhancements**:
- Added `id="sq2"` "AND also" input between search-row1 and search-row2
- Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id="msOnlyApps"`, `id="msSkipApps"`)
- Updated `buildUrl()` to combine `q + " " + q2` and convert times with `localTimeToUtc()`
- Added `fmtDateTime(ts)` showing "Apr 20 14:08" format
- Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC
- Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`
- **Timetable tab** (new page):
- Tab button added between Work Report and AI Summary
- `showPage` array updated: `['activity','search','audio','report','timetable','summary']`
- `refresh()` calls `loadTimetable()` when on timetable page
- **Timetable CSS** (key styles):
```css
.tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }
.tt-inner { position:relative; height:52px; } /* width set dynamically */
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
.tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }
.tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }
```
- **Timetable JS state variables**:
```javascript
let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;
let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;
const _ttAppColors = {};
const TT_ZOOMS = [1, 2, 4, 8, 16, 32];
const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};
```
- **Key JS functions**:
- `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders
- `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead
- `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)
- `ttOverviewClick(e)` — scrolls timeline + seeks video
- `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`
- `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`
- `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video
- `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked
- `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`
- `_ttShowNow(f)` — updates screenshot thumbnail + now-text div
- `ttSyncBtn()` — syncs play/pause button text
- Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom
- **`/volume1/screenpipe/.gitignore`**
```
*.db, *.sqlite, *.sqlite-shm, *.sqlite-wal
data/, \#recycle/,
@eaDir/
app_settings.json, app/.env
__pycache__/, *.pyc, .DS_Store
```
4. Errors and Fixes:
- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\#recycle/`. Also had to `git rm --cached "#recycle/desktop.ini"` to unstage it.
- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.
- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.
- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.
- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.
5. Problem Solving:
- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.
- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.
- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).
- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.
6. All User Messages:
- "do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps."
- "doi I need to restart?"
- "there is sudo docker compose"
- "no still the same"
- "add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git"
- "just do it" (re: git push)
- "how to make sure data in :8767 are accurate and point to archive.db"
- "I can't see older than 16th there should 21st of april. In http://[IP_ADDRESS]:8766/ I can see all but not on sqlite viewer http://[IP_ADDRESS]:8767"
- "ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive"
- [docker compose output showing orphan container error]
- "looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast"
- "lets make the playing speed more than 8x"
- "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
7. Pending Tasks:
- **Playback speed fix** (in progress, partially done):
- Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` inside `ttInner` HTML
- Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions
- Update speed select `onchange` to call `ttSetSpeed(+this.value)`
- Add 64× option to speed select
- Update `_ttMovePlayhead` to also update `ttPlayheadTime` label
- Update `ttSyncBtn` to start/stop timer based on play state + speed
- Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)
- Rebuild Docker image after changes
8. Current Work:
Working on fixing two issues with the Timetable tab:
1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.
2. **Timeline position indicator**: Playhead not prominent enough.
**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:
```css
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
```
Session was interrupted by summary request after this CSS edit, mid-implementation.
9. Optional Next Step:
Continuing the fix for: "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
The next steps in order are:
1. Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)
2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`
3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)
4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option
5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer
6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`
If you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl
Continue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with "I'll continue" or similar. Pick up the last task as if the break never happened.
Thinking
Thinking
Bash
Find timetable speed and playhead related code
IN
grep -n "tt-playhead\|ttPlayhead\|ttInner\|_ttMovePlayhead\|ttSetSpeed\|_ttStartSpeed\|_ttStopSpeed\|ttSyncBtn\|playbackRate\|speed.*select\|spdSel\|ttSpeed" /volume1/screenpipe/app/static/index.html | head -80
Copy code to clipboard
OUT
207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
580: <div class="tt-inner" id="ttInner" onclick="ttTimelineClick(event)">
583: <div class="tt-playhead" id="ttPlayhead"></div>
598: onpause="ttSyncBtn()"
599: onplay="ttSyncBtn()">
607: <select id="ttSpeed" onchange="document.getElementById('ttVideo').playbackRate=+this.value">
1624: document.getElementById('ttInner').style.width = '100%';
1632: document.getElementById('ttPlayhead').style.display = 'none';
1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';
1700: const inner = document.getElementById('ttInner');
1710: const inner = document.getElementById('ttInner');
1718: const inner = document.getElementById('ttInner');
1750: _ttMovePlayhead(new Date(best.ts).getTime());
1772: _ttMovePlayhead(new Date(best.ts).getTime());
1791:function _ttMovePlayhead(tsMs) {
1792: const ph = document.getElementById('ttPlayhead');
1802: const ph = document.getElementById('ttPlayhead');
1805: const inner = document.getElementById('ttInner');
1819:function ttSyncBtn() {
Read
index.html
index.html
(lines 576-625)
Read
index.html
index.html
(lines 1786-1865)
Thinking
Thinking
Bash
Find chunk loading and playhead update functions
IN
grep -n "ttUpdatePlayhead\|ttNextChunk\|ttLoadChunk\|_ttCurChunk\|_ttChunks\|_ttFrames" /volume1/screenpipe/app/static/index.html | head -50
Copy code to clipboard
OUT
596: onended="ttNextChunk()"
597: ontimeupdate="ttUpdatePlayhead()"
1569:let _ttFrames = [];
1570:let _ttChunks = [];
1571:let _ttCurChunk = -1;
1607: _ttFrames = data.frames;
1609: for (const f of _ttFrames) {
1613: _ttChunks = [...chunkMap.values()];
1614: _ttCurChunk = -1;
1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();
1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();
1620: for (const f of _ttFrames) _ttColor(f.app);
1640: for (const f of _ttFrames) {
1736: if (!_ttFrames.length) return;
1737: let best = _ttFrames[0], minDiff = Infinity;
1738: for (const f of _ttFrames) {
1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);
1744: _ttCurChunk = ci;
1753:function ttNextChunk() {
1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;
1755: _ttCurChunk++;
1757: video.src = _ttChunks[_ttCurChunk][0].video_url;
1762:function ttUpdatePlayhead() {
1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;
1765: const chunk = _ttChunks[_ttCurChunk];
Read
index.html
index.html
(lines 1754-1793)
Thinking
Thinking
Read
index.html
index.html
(lines 1701-1760)
Thinking
Thinking
Read
index.html
index.html
(lines 1561-1640)
Thinking
Thinking
Bash
Find time formatting functions
IN
grep -n "function fmtTime\|function fmtDate\|function _fmt\|localTimeToUtc\|fmtDateTime" /volume1/screenpipe/app/static/index.html | head -20
Copy code to clipboard
OUT
1088: if (tf) url += `&time_from=${localTimeToUtc(tf)}`;
1089: if (tt) url += `&time_to=${localTimeToUtc(tt)}`;
1153: let meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge}`;
1166: meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge} <span class="badge ${r.is_input_device?'mic':'sys'}">${r.is_input_device?'MIC':'SYS'}</span>`;
1307:function fmtTime(ts) {
1312:function fmtDateTime(ts) {
1320:function localTimeToUtc(timeStr) {
1778:function _fmtSec(s) {
1788: `${fmtDateTime(f.ts)} · ${f.app}${f.win ? ' / ' + f.win : ''}`;
Read
index.html
index.html
(lines 1308-1327)
Thinking
Thinking
Now I have everything I need. I'll implement the frame-by-frame timer system that replaces
video.playbackRate
with wall-clock accurate playback, plus add the playhead time label. Let me make the changes:
Edit
index.html
index.html
Added 1 line...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Explorer (⇧⌘E)","depth":19,"bounds":{"left":0.0,"top":0.047885075,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.057462092,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXRadioButton","text":"Search (⇧⌘F)","depth":19,"bounds":{"left":0.0,"top":0.08619314,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.09577015,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXRadioButton","text":"Source Control (⌃⇧G) - 2 pending changes","depth":19,"bounds":{"left":0.0,"top":0.1245012,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.13407822,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXStaticText","text":"2","depth":22,"bounds":{"left":0.009640957,"top":0.1452514,"width":0.0019946808,"height":0.008778931},"role_description":"text"},{"role":"AXRadioButton","text":"Run and Debug (⇧⌘D)","depth":19,"bounds":{"left":0.0,"top":0.16280925,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.17238627,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXRadioButton","text":"Remote Explorer","depth":19,"bounds":{"left":0.0,"top":0.20111732,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.21069433,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXRadioButton","text":"Extensions (⇧⌘X) - 2 require update, 1 requires restart","depth":19,"bounds":{"left":0.0,"top":0.23942538,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.2490024,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXStaticText","text":"3","depth":22,"bounds":{"left":0.00930851,"top":0.2601756,"width":0.0023271276,"height":0.008778931},"role_description":"text"},{"role":"AXRadioButton","text":"Claude Code","depth":19,"bounds":{"left":0.0,"top":0.27773345,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"Containers","depth":19,"bounds":{"left":0.0,"top":0.3160415,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"EXPLORER","depth":17,"bounds":{"left":0.022606382,"top":0.047885075,"width":0.018949468,"height":0.02793296},"role_description":"heading"},{"role":"AXStaticText","text":"EXPLORER","depth":18,"bounds":{"left":0.022606382,"top":0.056664005,"width":0.018949468,"height":0.0103751},"role_description":"text"},{"role":"AXButton","text":"Explorer Section: screenpipe [SSH: nas]","depth":21,"bounds":{"left":0.015957447,"top":0.07581804,"width":0.09940159,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.07821229,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXHeading","text":"Explorer Section: screenpipe [SSH: nas]","depth":22,"bounds":{"left":0.022606382,"top":0.07581804,"width":0.045877658,"height":0.017557861},"role_description":"heading"},{"role":"AXStaticText","text":"SCREENPIPE [SSH: NAS]","depth":23,"bounds":{"left":0.022606382,"top":0.079010375,"width":0.045877658,"height":0.0103751},"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.09577015,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"#recycle","depth":27,"bounds":{"left":0.025930852,"top":0.09577015,"width":0.017287234,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.11332801,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"app","depth":27,"bounds":{"left":0.025930852,"top":0.11332801,"width":0.0076462766,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.10605053,"top":0.11412609,"width":0.004654255,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.13088587,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"data","depth":27,"bounds":{"left":0.025930852,"top":0.13088587,"width":0.008976064,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.14844373,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"pipes","depth":27,"bounds":{"left":0.025930852,"top":0.14844373,"width":0.010970744,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.16440542,"width":0.0063164895,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":".gitignore","depth":27,"bounds":{"left":0.025930852,"top":0.1660016,"width":0.018949468,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.1819633,"width":0.0063164895,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"app_settings.json","depth":27,"bounds":{"left":0.025930852,"top":0.18355946,"width":0.03557181,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.19952115,"width":0.0076462766,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"archive.db","depth":27,"bounds":{"left":0.025930852,"top":0.20111732,"width":0.020944148,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.21707901,"width":0.0076462766,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"db.sqlite","depth":27,"bounds":{"left":0.025930852,"top":0.21867518,"width":0.017287234,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.23463687,"width":0.0063164895,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"screenpipe_sync.sh","depth":27,"bounds":{"left":0.025930852,"top":0.23623304,"width":0.039893616,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.25219473,"width":0.0076462766,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"screenpipe.db","depth":27,"bounds":{"left":0.025930852,"top":0.25379092,"width":0.028590426,"height":0.011971269},"role_description":"text"},{"role":"AXButton","text":"Outline Section","depth":21,"bounds":{"left":0.015957447,"top":0.9473264,"width":0.09940159,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.9497207,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXHeading","text":"OUTLINE","depth":22,"bounds":{"left":0.022606382,"top":0.9473264,"width":0.01662234,"height":0.017557861},"role_description":"heading"},{"role":"AXStaticText","text":"OUTLINE","depth":23,"bounds":{"left":0.022606382,"top":0.95131683,"width":0.01662234,"height":0.0103751},"role_description":"text"},{"role":"AXButton","text":"Timeline Section","depth":21,"bounds":{"left":0.015957447,"top":0.9648843,"width":0.09940159,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.96727854,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXHeading","text":"TIMELINE","depth":22,"bounds":{"left":0.022606382,"top":0.9648843,"width":0.01761968,"height":0.017557861},"role_description":"heading"},{"role":"AXStaticText","text":"TIMELINE","depth":23,"bounds":{"left":0.022606382,"top":0.9688747,"width":0.01761968,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"app_settings.json, Editor Group 1","depth":28,"bounds":{"left":0.11569149,"top":0.047885075,"width":0.055851065,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe_sync.sh, Editor Group 1","depth":28,"bounds":{"left":0.17154256,"top":0.047885075,"width":0.06050532,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":"db.sqlite-shm, preview, Editor Group 1","depth":28,"bounds":{"left":0.23171543,"top":0.047885075,"width":0.04886968,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/Test/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","depth":28,"bounds":{"left":0.11569149,"top":0.0933759,"width":0.38031915,"height":0.0007980846},"value":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/Test/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","role_description":"editor","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/Test/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","depth":29,"bounds":{"left":0.11569149,"top":0.0933759,"width":0.35804522,"height":0.0007980846},"role_description":"text"},{"role":"AXRadioButton","text":"lets add ability to jump…, Editor Group 2","depth":28,"bounds":{"left":0.5578458,"top":0.047885075,"width":0.06948138,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":"Problems (⇧⌘M)","depth":22,"bounds":{"left":0.118351065,"top":0.59936154,"width":0.027925532,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PROBLEMS","depth":24,"bounds":{"left":0.122340426,"top":0.60814047,"width":0.019946808,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Output (⇧⌘U)","depth":22,"bounds":{"left":0.14594415,"top":0.59936154,"width":0.023603724,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUTPUT","depth":24,"bounds":{"left":0.14993352,"top":0.60814047,"width":0.015625,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Debug Console (⇧⌘Y)","depth":22,"bounds":{"left":0.16921543,"top":0.59936154,"width":0.039893616,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"DEBUG CONSOLE","depth":24,"bounds":{"left":0.1732048,"top":0.60814047,"width":0.031914894,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Terminal (⌃`)","depth":22,"bounds":{"left":0.2087766,"top":0.59936154,"width":0.026595745,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"TERMINAL","depth":24,"bounds":{"left":0.21276596,"top":0.60814047,"width":0.01861702,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Ports","depth":22,"bounds":{"left":0.23537233,"top":0.59936154,"width":0.020279255,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PORTS","depth":24,"bounds":{"left":0.2393617,"top":0.60814047,"width":0.012300532,"height":0.0103751},"role_description":"text"},{"role":"AXButton","text":"remote SSH: nas","depth":16,"bounds":{"left":0.0006648936,"top":0.98244214,"width":0.028590426,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.0033244682,"top":0.9848364,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"SSH: nas","depth":17,"bounds":{"left":0.008643617,"top":0.9856345,"width":0.017952127,"height":0.011173184},"role_description":"text"},{"role":"AXButton","text":"screenpipe (Git) - master*, Checkout Branch/Tag...","depth":16,"bounds":{"left":0.030917553,"top":0.98244214,"width":0.023271276,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.031914894,"top":0.9848364,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"master*","depth":17,"bounds":{"left":0.03723404,"top":0.9856345,"width":0.015957447,"height":0.011173184},"role_description":"text"},{"role":"AXButton","text":"screenpipe (Git) - Synchronize Changes","depth":16,"bounds":{"left":0.05418883,"top":0.98244214,"width":0.00731383,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"No Problems","depth":16,"bounds":{"left":0.06416223,"top":0.98244214,"width":0.022606382,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.06582447,"top":0.9848364,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"bounds":{"left":0.07114362,"top":0.9856345,"width":0.004986702,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.07579787,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"bounds":{"left":0.08111702,"top":0.9856345,"width":0.0039893617,"height":0.011173184},"role_description":"text"},{"role":"AXButton","text":"No Ports Forwarded","depth":16,"bounds":{"left":0.08843085,"top":0.98244214,"width":0.012632979,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.09009308,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"bounds":{"left":0.09541223,"top":0.9856345,"width":0.0039893617,"height":0.011173184},"role_description":"text"},{"role":"AXButton","text":"Notifications","depth":16,"bounds":{"left":0.9886968,"top":0.98244214,"width":0.010638298,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Signed out","depth":16,"bounds":{"left":0.9567819,"top":0.98244214,"width":0.031914894,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.9594415,"top":0.9848364,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Signed out","depth":17,"bounds":{"left":0.96476066,"top":0.9856345,"width":0.021276595,"height":0.011173184},"role_description":"text"},{"role":"AXButton","text":"Shell Script","depth":16,"bounds":{"left":0.93151593,"top":0.98244214,"width":0.023603724,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions","depth":16,"bounds":{"left":0.92420214,"top":0.98244214,"width":0.0076462766,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"LF","depth":16,"bounds":{"left":0.91356385,"top":0.98244214,"width":0.00831117,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"UTF-8","depth":16,"bounds":{"left":0.8962766,"top":0.98244214,"width":0.015625,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Spaces: 2","depth":16,"bounds":{"left":0.87234044,"top":0.98244214,"width":0.021941489,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Ln 352, Col 47 (13096 selected)","depth":16,"bounds":{"left":0.80518615,"top":0.98244214,"width":0.065159574,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Screen Reader Optimized","depth":16,"bounds":{"left":0.75099736,"top":0.98244214,"width":0.05319149,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"git-commit Lukas Kovalik (23 hours ago)","depth":16,"bounds":{"left":0.68583775,"top":0.98244214,"width":0.06416223,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.6875,"top":0.9848364,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Lukas Kovalik (23 hours ago)","depth":17,"bounds":{"left":0.6928192,"top":0.9856345,"width":0.055518616,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"Info: Downloading VS Code Server...","depth":12,"role_description":"text"},{"role":"AXButton","text":"lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time","depth":19,"bounds":{"left":0.56017286,"top":0.08060654,"width":0.099734046,"height":0.022346368},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Session history","depth":19,"bounds":{"left":0.9780585,"top":0.08060654,"width":0.00930851,"height":0.022346368},"help_text":"Session history","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New session","depth":19,"bounds":{"left":0.9886968,"top":0.08060654,"width":0.00930851,"height":0.022346368},"help_text":"New session","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Message actions","depth":24,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.\n\nSummary:\n1. Primary Request and Intent:\n\nThe user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:\n- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.\n- **Q2**: AND combination search (term1 + term2 must both appear) → Added \"AND also\" input field.\n- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.\n- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.\n- **Q5**: \"still the same\" (container not picking up config) → Explained `up -d` vs `restart`.\n- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.\n- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.\n- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.\n- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.\n\n2. Key Technical Concepts:\n\n- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.\n- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.\n- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.\n- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.\n- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.\n- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.\n- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.\n- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.\n- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.\n- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.\n- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\\#recycle/`.\n\n3. Files and Code Sections:\n\n- **`/volume1/screenpipe/app/main.py`**\n - Added `/api/apps` endpoint (all unique app names from frames table)\n - Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)\n - `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: \"...\"}`\n - Key snippet:\n ```python","depth":26,"role_description":"text"},{"role":"AXButton","text":"@app.get(\"/api/timetable\"","depth":26,"help_text":"Open app.get(\"/api/timetable\"","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":")\n async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):\n ...\n rows = conn.execute(f\"\"\"\n SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,\n f.offset_index, f.snapshot_path,\n vc.file_path AS video_path, vc.fps AS video_fps\n FROM frames f\n JOIN video_chunks vc ON f.video_chunk_id = vc.id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND f.video_chunk_id IS NOT NULL {dev_clause}\n ORDER BY f.timestamp\n \"\"\", params).fetchall()\n # seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)\n ```\n\n- **`/volume1/screenpipe/app/docker-compose.yml`**\n - Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`\n - Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`\n - screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`\n\n- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)\n - **Search enhancements**:\n - Added `id=\"sq2\"` \"AND also\" input between search-row1 and search-row2\n - Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id=\"msOnlyApps\"`, `id=\"msSkipApps\"`)\n - Updated `buildUrl()` to combine `q + \" \" + q2` and convert times with `localTimeToUtc()`\n - Added `fmtDateTime(ts)` showing \"Apr 20 14:08\" format\n - Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC\n - Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`\n - **Timetable tab** (new page):\n - Tab button added between Work Report and AI Summary\n - `showPage` array updated: `['activity','search','audio','report','timetable','summary']`\n - `refresh()` calls `loadTimetable()` when on timetable page\n - **Timetable CSS** (key styles):\n ```css\n .tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }\n .tt-inner { position:relative; height:52px; } /* width set dynamically */\n .tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n .tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n .tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }\n .tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }\n ```\n - **Timetable JS state variables**:\n ```javascript\n let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;\n let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;\n const _ttAppColors = {};\n const TT_ZOOMS = [1, 2, 4, 8, 16, 32];\n const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};\n ```\n - **Key JS functions**:\n - `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders\n - `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead\n - `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)\n - `ttOverviewClick(e)` — scrolls timeline + seeks video\n - `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`\n - `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`\n - `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video\n - `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked\n - `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`\n - `_ttShowNow(f)` — updates screenshot thumbnail + now-text div\n - `ttSyncBtn()` — syncs play/pause button text\n - Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom\n\n- **`/volume1/screenpipe/.gitignore`**\n ```\n *.db, *.sqlite, *.sqlite-shm, *.sqlite-wal\n data/, \\#recycle/,","depth":26,"role_description":"text"},{"role":"AXButton","text":"@eaDir/","depth":26,"help_text":"Open eaDir/","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"app_settings.json, app/.env\n __pycache__/, *.pyc, .DS_Store\n ```\n\n4. Errors and Fixes:\n\n- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\\#recycle/`. Also had to `git rm --cached \"#recycle/desktop.ini\"` to unstage it.\n- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.\n- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.\n- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.\n- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.\n\n5. Problem Solving:\n\n- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.\n- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.\n- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).\n- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.\n\n6. All User Messages:\n\n- \"do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps.\"\n- \"doi I need to restart?\"\n- \"there is sudo docker compose\"\n- \"no still the same\"\n- \"add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git\"\n- \"just do it\" (re: git push)\n- \"how to make sure data in :8767 are accurate and point to archive.db\"\n- \"I can't see older than 16th there should 21st of april. In http://192.168.0.242:8766/ I can see all but not on sqlite viewer http://192.168.0.242:8767\"\n- \"ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive\"\n- [docker compose output showing orphan container error]\n- \"looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast\"\n- \"lets make the playing speed more than 8x\"\n- \"still playing speed is not showing properly still just in one second. also I want to see in timeline where I am\"\n\n7. Pending Tasks:\n\n- **Playback speed fix** (in progress, partially done):\n - Add `<div class=\"tt-playhead-time\" id=\"ttPlayheadTime\"></div>` inside `ttInner` HTML\n - Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions\n - Update speed select `onchange` to call `ttSetSpeed(+this.value)`\n - Add 64× option to speed select\n - Update `_ttMovePlayhead` to also update `ttPlayheadTime` label\n - Update `ttSyncBtn` to start/stop timer based on play state + speed\n - Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)\n - Rebuild Docker image after changes\n\n8. Current Work:\n\nWorking on fixing two issues with the Timetable tab:\n1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.\n2. **Timeline position indicator**: Playhead not prominent enough. \n\n**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:\n```css\n.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n```\n\nSession was interrupted by summary request after this CSS edit, mid-implementation.\n\n9. Optional Next Step:\n\nContinuing the fix for: \"still playing speed is not showing properly still just in one second. also I want to see in timeline where I am\"\n\nThe next steps in order are:\n1. Add `<div class=\"tt-playhead-time\" id=\"ttPlayheadTime\"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)\n2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`\n3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)\n4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option\n5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer\n6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`\n\nIf you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl\nContinue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with \"I'll continue\" or similar. Pick up the last task as if the break never happened.","depth":26,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find timetable speed and playhead related code","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"tt-playhead\\|ttPlayhead\\|ttInner\\|_ttMovePlayhead\\|ttSetSpeed\\|_ttStartSpeed\\|_ttStopSpeed\\|ttSyncBtn\\|playbackRate\\|speed.*select\\|spdSel\\|ttSpeed\" /volume1/screenpipe/app/static/index.html | head -80","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n580: <div class=\"tt-inner\" id=\"ttInner\" onclick=\"ttTimelineClick(event)\">\n583: <div class=\"tt-playhead\" id=\"ttPlayhead\"></div>\n598: onpause=\"ttSyncBtn()\"\n599: onplay=\"ttSyncBtn()\">\n607: <select id=\"ttSpeed\" onchange=\"document.getElementById('ttVideo').playbackRate=+this.value\">\n1624: document.getElementById('ttInner').style.width = '100%';\n1632: document.getElementById('ttPlayhead').style.display = 'none';\n1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';\n1700: const inner = document.getElementById('ttInner');\n1710: const inner = document.getElementById('ttInner');\n1718: const inner = document.getElementById('ttInner');\n1750: _ttMovePlayhead(new Date(best.ts).getTime());\n1772: _ttMovePlayhead(new Date(best.ts).getTime());\n1791:function _ttMovePlayhead(tsMs) {\n1792: const ph = document.getElementById('ttPlayhead');\n1802: const ph = document.getElementById('ttPlayhead');\n1805: const inner = document.getElementById('ttInner');\n1819:function ttSyncBtn() {","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 576-625)","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1786-1865)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find chunk loading and playhead update functions","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"ttUpdatePlayhead\\|ttNextChunk\\|ttLoadChunk\\|_ttCurChunk\\|_ttChunks\\|_ttFrames\" /volume1/screenpipe/app/static/index.html | head -50","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"596: onended=\"ttNextChunk()\"\n597: ontimeupdate=\"ttUpdatePlayhead()\"\n1569:let _ttFrames = [];\n1570:let _ttChunks = [];\n1571:let _ttCurChunk = -1;\n1607: _ttFrames = data.frames;\n1609: for (const f of _ttFrames) {\n1613: _ttChunks = [...chunkMap.values()];\n1614: _ttCurChunk = -1;\n1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();\n1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();\n1620: for (const f of _ttFrames) _ttColor(f.app);\n1640: for (const f of _ttFrames) {\n1736: if (!_ttFrames.length) return;\n1737: let best = _ttFrames[0], minDiff = Infinity;\n1738: for (const f of _ttFrames) {\n1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);\n1744: _ttCurChunk = ci;\n1753:function ttNextChunk() {\n1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;\n1755: _ttCurChunk++;\n1757: video.src = _ttChunks[_ttCurChunk][0].video_url;\n1762:function ttUpdatePlayhead() {\n1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;\n1765: const chunk = _ttChunks[_ttCurChunk];","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1754-1793)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1701-1760)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1561-1640)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find time formatting functions","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"function fmtTime\\|function fmtDate\\|function _fmt\\|localTimeToUtc\\|fmtDateTime\" /volume1/screenpipe/app/static/index.html | head -20","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"1088: if (tf) url += `&time_from=${localTimeToUtc(tf)}`;\n1089: if (tt) url += `&time_to=${localTimeToUtc(tt)}`;\n1153: let meta = `<span style=\"color:var(--muted)\">${fmtDateTime(r.timestamp)}</span>${srcBadge}`;\n1166: meta = `<span style=\"color:var(--muted)\">${fmtDateTime(r.timestamp)}</span>${srcBadge} <span class=\"badge ${r.is_input_device?'mic':'sys'}\">${r.is_input_device?'MIC':'SYS'}</span>`;\n1307:function fmtTime(ts) {\n1312:function fmtDateTime(ts) {\n1320:function localTimeToUtc(timeStr) {\n1778:function _fmtSec(s) {\n1788: `${fmtDateTime(f.ts)} · ${f.app}${f.win ? ' / ' + f.win : ''}`;","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1308-1327)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Now I have everything I need. I'll implement the frame-by-frame timer system that replaces","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"video.playbackRate","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"with wall-clock accurate playback, plus add the playhead time label. Let me make the changes:","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Edit","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Added 1 line","depth":24,"role_description":"text"}]...
|
-7616568506802356149
|
4474475550963076503
|
visual_change
|
accessibility
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G) - 2 pending changes
2
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: nas]
Explorer Section: screenpipe [SSH: nas]
SCREENPIPE [SSH: NAS]
#recycle
app
data
pipes
.gitignore
app_settings.json
archive.db
db.sqlite
screenpipe_sync.sh
screenpipe.db
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
app_settings.json, Editor Group 1
screenpipe_sync.sh, Editor Group 1
db.sqlite-shm, preview, Editor Group 1
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lets add ability to jump…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: nas
SSH: nas
screenpipe (Git) - master*, Checkout Branch/Tag...
master*
screenpipe (Git) - Synchronize Changes
No Problems
0
0
No Ports Forwarded
0
Notifications
Signed out
Signed out
Shell Script
Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions
LF
UTF-8
Spaces: 2
Ln 352, Col 47 (13096 selected)
Screen Reader Optimized
git-commit Lukas Kovalik (23 hours ago)
Lukas Kovalik (23 hours ago)
Info: Downloading VS Code Server...
lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time
Session history
New session
Message actions
This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.
Summary:
1. Primary Request and Intent:
The user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:
- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.
- **Q2**: AND combination search (term1 + term2 must both appear) → Added "AND also" input field.
- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.
- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.
- **Q5**: "still the same" (container not picking up config) → Explained `up -d` vs `restart`.
- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.
- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.
- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.
- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.
2. Key Technical Concepts:
- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.
- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.
- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.
- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.
- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.
- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.
- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.
- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.
- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.
- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.
- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\#recycle/`.
3. Files and Code Sections:
- **`/volume1/screenpipe/app/main.py`**
- Added `/api/apps` endpoint (all unique app names from frames table)
- Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)
- `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: "..."}`
- Key snippet:
```python
@app.get("/api/timetable"
)
async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):
...
rows = conn.execute(f"""
SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,
f.offset_index, f.snapshot_path,
vc.file_path AS video_path, vc.fps AS video_fps
FROM frames f
JOIN video_chunks vc ON f.video_chunk_id = vc.id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND f.video_chunk_id IS NOT NULL {dev_clause}
ORDER BY f.timestamp
""", params).fetchall()
# seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)
```
- **`/volume1/screenpipe/app/docker-compose.yml`**
- Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`
- Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`
- screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`
- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)
- **Search enhancements**:
- Added `id="sq2"` "AND also" input between search-row1 and search-row2
- Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id="msOnlyApps"`, `id="msSkipApps"`)
- Updated `buildUrl()` to combine `q + " " + q2` and convert times with `localTimeToUtc()`
- Added `fmtDateTime(ts)` showing "Apr 20 14:08" format
- Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC
- Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`
- **Timetable tab** (new page):
- Tab button added between Work Report and AI Summary
- `showPage` array updated: `['activity','search','audio','report','timetable','summary']`
- `refresh()` calls `loadTimetable()` when on timetable page
- **Timetable CSS** (key styles):
```css
.tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }
.tt-inner { position:relative; height:52px; } /* width set dynamically */
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
.tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }
.tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }
```
- **Timetable JS state variables**:
```javascript
let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;
let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;
const _ttAppColors = {};
const TT_ZOOMS = [1, 2, 4, 8, 16, 32];
const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};
```
- **Key JS functions**:
- `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders
- `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead
- `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)
- `ttOverviewClick(e)` — scrolls timeline + seeks video
- `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`
- `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`
- `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video
- `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked
- `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`
- `_ttShowNow(f)` — updates screenshot thumbnail + now-text div
- `ttSyncBtn()` — syncs play/pause button text
- Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom
- **`/volume1/screenpipe/.gitignore`**
```
*.db, *.sqlite, *.sqlite-shm, *.sqlite-wal
data/, \#recycle/,
@eaDir/
app_settings.json, app/.env
__pycache__/, *.pyc, .DS_Store
```
4. Errors and Fixes:
- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\#recycle/`. Also had to `git rm --cached "#recycle/desktop.ini"` to unstage it.
- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.
- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.
- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.
- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.
5. Problem Solving:
- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.
- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.
- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).
- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.
6. All User Messages:
- "do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps."
- "doi I need to restart?"
- "there is sudo docker compose"
- "no still the same"
- "add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git"
- "just do it" (re: git push)
- "how to make sure data in :8767 are accurate and point to archive.db"
- "I can't see older than 16th there should 21st of april. In http://[IP_ADDRESS]:8766/ I can see all but not on sqlite viewer http://[IP_ADDRESS]:8767"
- "ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive"
- [docker compose output showing orphan container error]
- "looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast"
- "lets make the playing speed more than 8x"
- "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
7. Pending Tasks:
- **Playback speed fix** (in progress, partially done):
- Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` inside `ttInner` HTML
- Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions
- Update speed select `onchange` to call `ttSetSpeed(+this.value)`
- Add 64× option to speed select
- Update `_ttMovePlayhead` to also update `ttPlayheadTime` label
- Update `ttSyncBtn` to start/stop timer based on play state + speed
- Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)
- Rebuild Docker image after changes
8. Current Work:
Working on fixing two issues with the Timetable tab:
1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.
2. **Timeline position indicator**: Playhead not prominent enough.
**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:
```css
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
```
Session was interrupted by summary request after this CSS edit, mid-implementation.
9. Optional Next Step:
Continuing the fix for: "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
The next steps in order are:
1. Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)
2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`
3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)
4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option
5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer
6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`
If you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl
Continue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with "I'll continue" or similar. Pick up the last task as if the break never happened.
Thinking
Thinking
Bash
Find timetable speed and playhead related code
IN
grep -n "tt-playhead\|ttPlayhead\|ttInner\|_ttMovePlayhead\|ttSetSpeed\|_ttStartSpeed\|_ttStopSpeed\|ttSyncBtn\|playbackRate\|speed.*select\|spdSel\|ttSpeed" /volume1/screenpipe/app/static/index.html | head -80
Copy code to clipboard
OUT
207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
580: <div class="tt-inner" id="ttInner" onclick="ttTimelineClick(event)">
583: <div class="tt-playhead" id="ttPlayhead"></div>
598: onpause="ttSyncBtn()"
599: onplay="ttSyncBtn()">
607: <select id="ttSpeed" onchange="document.getElementById('ttVideo').playbackRate=+this.value">
1624: document.getElementById('ttInner').style.width = '100%';
1632: document.getElementById('ttPlayhead').style.display = 'none';
1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';
1700: const inner = document.getElementById('ttInner');
1710: const inner = document.getElementById('ttInner');
1718: const inner = document.getElementById('ttInner');
1750: _ttMovePlayhead(new Date(best.ts).getTime());
1772: _ttMovePlayhead(new Date(best.ts).getTime());
1791:function _ttMovePlayhead(tsMs) {
1792: const ph = document.getElementById('ttPlayhead');
1802: const ph = document.getElementById('ttPlayhead');
1805: const inner = document.getElementById('ttInner');
1819:function ttSyncBtn() {
Read
index.html
index.html
(lines 576-625)
Read
index.html
index.html
(lines 1786-1865)
Thinking
Thinking
Bash
Find chunk loading and playhead update functions
IN
grep -n "ttUpdatePlayhead\|ttNextChunk\|ttLoadChunk\|_ttCurChunk\|_ttChunks\|_ttFrames" /volume1/screenpipe/app/static/index.html | head -50
Copy code to clipboard
OUT
596: onended="ttNextChunk()"
597: ontimeupdate="ttUpdatePlayhead()"
1569:let _ttFrames = [];
1570:let _ttChunks = [];
1571:let _ttCurChunk = -1;
1607: _ttFrames = data.frames;
1609: for (const f of _ttFrames) {
1613: _ttChunks = [...chunkMap.values()];
1614: _ttCurChunk = -1;
1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();
1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();
1620: for (const f of _ttFrames) _ttColor(f.app);
1640: for (const f of _ttFrames) {
1736: if (!_ttFrames.length) return;
1737: let best = _ttFrames[0], minDiff = Infinity;
1738: for (const f of _ttFrames) {
1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);
1744: _ttCurChunk = ci;
1753:function ttNextChunk() {
1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;
1755: _ttCurChunk++;
1757: video.src = _ttChunks[_ttCurChunk][0].video_url;
1762:function ttUpdatePlayhead() {
1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;
1765: const chunk = _ttChunks[_ttCurChunk];
Read
index.html
index.html
(lines 1754-1793)
Thinking
Thinking
Read
index.html
index.html
(lines 1701-1760)
Thinking
Thinking
Read
index.html
index.html
(lines 1561-1640)
Thinking
Thinking
Bash
Find time formatting functions
IN
grep -n "function fmtTime\|function fmtDate\|function _fmt\|localTimeToUtc\|fmtDateTime" /volume1/screenpipe/app/static/index.html | head -20
Copy code to clipboard
OUT
1088: if (tf) url += `&time_from=${localTimeToUtc(tf)}`;
1089: if (tt) url += `&time_to=${localTimeToUtc(tt)}`;
1153: let meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge}`;
1166: meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge} <span class="badge ${r.is_input_device?'mic':'sys'}">${r.is_input_device?'MIC':'SYS'}</span>`;
1307:function fmtTime(ts) {
1312:function fmtDateTime(ts) {
1320:function localTimeToUtc(timeStr) {
1778:function _fmtSec(s) {
1788: `${fmtDateTime(f.ts)} · ${f.app}${f.win ? ' / ' + f.win : ''}`;
Read
index.html
index.html
(lines 1308-1327)
Thinking
Thinking
Now I have everything I need. I'll implement the frame-by-frame timer system that replaces
video.playbackRate
with wall-clock accurate playback, plus add the playhead time label. Let me make the changes:
Edit
index.html
index.html
Added 1 line...
|
81022
|
NULL
|
|
81025
|
2156
|
8
|
2026-04-25T15:56:21.192275+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-25/1777 /Users/lukas/.screenpipe/data/data/2026-04-25/1777132581192_m1.jpg...
|
Code
|
screenpipe_sync.sh — screenpipe [SSH: nas]
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G) - 2 pending changes
2
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: nas]
Explorer Section: screenpipe [SSH: nas]
SCREENPIPE [SSH: NAS]
#recycle
app
data
pipes
.gitignore
app_settings.json
archive.db
db.sqlite
screenpipe_sync.sh
screenpipe.db
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
app_settings.json, Editor Group 1
screenpipe_sync.sh, Editor Group 1
db.sqlite-shm, preview, Editor Group 1
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lets add ability to jump…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: nas
SSH: nas
screenpipe (Git) - master*, Checkout Branch/Tag...
master*
screenpipe (Git) - Synchronize Changes
No Problems
0
0
No Ports Forwarded
0
Notifications
Signed out
Signed out
Shell Script
Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions
LF
UTF-8
Spaces: 2
Ln 320, Col 36
Screen Reader Optimized
git-commit Lukas Kovalik (23 hours ago)
Lukas Kovalik (23 hours ago)
Info: Downloading VS Code Server...
lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time
Session history
New session
Message actions
This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.
Summary:
1. Primary Request and Intent:
The user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:
- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.
- **Q2**: AND combination search (term1 + term2 must both appear) → Added "AND also" input field.
- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.
- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.
- **Q5**: "still the same" (container not picking up config) → Explained `up -d` vs `restart`.
- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.
- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.
- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.
- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.
2. Key Technical Concepts:
- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.
- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.
- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.
- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.
- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.
- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.
- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.
- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.
- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.
- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.
- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\#recycle/`.
3. Files and Code Sections:
- **`/volume1/screenpipe/app/main.py`**
- Added `/api/apps` endpoint (all unique app names from frames table)
- Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)
- `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: "..."}`
- Key snippet:
```python
@app.get("/api/timetable"
)
async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):
...
rows = conn.execute(f"""
SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,
f.offset_index, f.snapshot_path,
vc.file_path AS video_path, vc.fps AS video_fps
FROM frames f
JOIN video_chunks vc ON f.video_chunk_id = vc.id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND f.video_chunk_id IS NOT NULL {dev_clause}
ORDER BY f.timestamp
""", params).fetchall()
# seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)
```
- **`/volume1/screenpipe/app/docker-compose.yml`**
- Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`
- Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`
- screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`
- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)
- **Search enhancements**:
- Added `id="sq2"` "AND also" input between search-row1 and search-row2
- Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id="msOnlyApps"`, `id="msSkipApps"`)
- Updated `buildUrl()` to combine `q + " " + q2` and convert times with `localTimeToUtc()`
- Added `fmtDateTime(ts)` showing "Apr 20 14:08" format
- Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC
- Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`
- **Timetable tab** (new page):
- Tab button added between Work Report and AI Summary
- `showPage` array updated: `['activity','search','audio','report','timetable','summary']`
- `refresh()` calls `loadTimetable()` when on timetable page
- **Timetable CSS** (key styles):
```css
.tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }
.tt-inner { position:relative; height:52px; } /* width set dynamically */
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
.tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }
.tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }
```
- **Timetable JS state variables**:
```javascript
let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;
let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;
const _ttAppColors = {};
const TT_ZOOMS = [1, 2, 4, 8, 16, 32];
const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};
```
- **Key JS functions**:
- `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders
- `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead
- `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)
- `ttOverviewClick(e)` — scrolls timeline + seeks video
- `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`
- `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`
- `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video
- `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked
- `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`
- `_ttShowNow(f)` — updates screenshot thumbnail + now-text div
- `ttSyncBtn()` — syncs play/pause button text
- Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom
- **`/volume1/screenpipe/.gitignore`**
```
*.db, *.sqlite, *.sqlite-shm, *.sqlite-wal
data/, \#recycle/,
@eaDir/
app_settings.json, app/.env
__pycache__/, *.pyc, .DS_Store
```
4. Errors and Fixes:
- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\#recycle/`. Also had to `git rm --cached "#recycle/desktop.ini"` to unstage it.
- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.
- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.
- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.
- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.
5. Problem Solving:
- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.
- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.
- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).
- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.
6. All User Messages:
- "do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps."
- "doi I need to restart?"
- "there is sudo docker compose"
- "no still the same"
- "add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git"
- "just do it" (re: git push)
- "how to make sure data in :8767 are accurate and point to archive.db"
- "I can't see older than 16th there should 21st of april. In http://[IP_ADDRESS]:8766/ I can see all but not on sqlite viewer http://[IP_ADDRESS]:8767"
- "ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive"
- [docker compose output showing orphan container error]
- "looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast"
- "lets make the playing speed more than 8x"
- "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
7. Pending Tasks:
- **Playback speed fix** (in progress, partially done):
- Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` inside `ttInner` HTML
- Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions
- Update speed select `onchange` to call `ttSetSpeed(+this.value)`
- Add 64× option to speed select
- Update `_ttMovePlayhead` to also update `ttPlayheadTime` label
- Update `ttSyncBtn` to start/stop timer based on play state + speed
- Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)
- Rebuild Docker image after changes
8. Current Work:
Working on fixing two issues with the Timetable tab:
1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.
2. **Timeline position indicator**: Playhead not prominent enough.
**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:
```css
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
```
Session was interrupted by summary request after this CSS edit, mid-implementation.
9. Optional Next Step:
Continuing the fix for: "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
The next steps in order are:
1. Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)
2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`
3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)
4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option
5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer
6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`
If you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl
Continue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with "I'll continue" or similar. Pick up the last task as if the break never happened.
Thinking
Thinking
Bash
Find timetable speed and playhead related code
IN
grep -n "tt-playhead\|ttPlayhead\|ttInner\|_ttMovePlayhead\|ttSetSpeed\|_ttStartSpeed\|_ttStopSpeed\|ttSyncBtn\|playbackRate\|speed.*select\|spdSel\|ttSpeed" /volume1/screenpipe/app/static/index.html | head -80
Copy code to clipboard
OUT
207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
580: <div class="tt-inner" id="ttInner" onclick="ttTimelineClick(event)">
583: <div class="tt-playhead" id="ttPlayhead"></div>
598: onpause="ttSyncBtn()"
599: onplay="ttSyncBtn()">
607: <select id="ttSpeed" onchange="document.getElementById('ttVideo').playbackRate=+this.value">
1624: document.getElementById('ttInner').style.width = '100%';
1632: document.getElementById('ttPlayhead').style.display = 'none';
1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';
1700: const inner = document.getElementById('ttInner');
1710: const inner = document.getElementById('ttInner');
1718: const inner = document.getElementById('ttInner');
1750: _ttMovePlayhead(new Date(best.ts).getTime());
1772: _ttMovePlayhead(new Date(best.ts).getTime());
1791:function _ttMovePlayhead(tsMs) {
1792: const ph = document.getElementById('ttPlayhead');
1802: const ph = document.getElementById('ttPlayhead');
1805: const inner = document.getElementById('ttInner');
1819:function ttSyncBtn() {
Read
index.html
index.html
(lines 576-625)
Read
index.html
index.html
(lines 1786-1865)
Thinking
Thinking
Bash
Find chunk loading and playhead update functions
IN
grep -n "ttUpdatePlayhead\|ttNextChunk\|ttLoadChunk\|_ttCurChunk\|_ttChunks\|_ttFrames" /volume1/screenpipe/app/static/index.html | head -50
Copy code to clipboard
OUT
596: onended="ttNextChunk()"
597: ontimeupdate="ttUpdatePlayhead()"
1569:let _ttFrames = [];
1570:let _ttChunks = [];
1571:let _ttCurChunk = -1;
1607: _ttFrames = data.frames;
1609: for (const f of _ttFrames) {
1613: _ttChunks = [...chunkMap.values()];
1614: _ttCurChunk = -1;
1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();
1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();
1620: for (const f of _ttFrames) _ttColor(f.app);
1640: for (const f of _ttFrames) {
1736: if (!_ttFrames.length) return;
1737: let best = _ttFrames[0], minDiff = Infinity;
1738: for (const f of _ttFrames) {
1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);
1744: _ttCurChunk = ci;
1753:function ttNextChunk() {
1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;
1755: _ttCurChunk++;
1757: video.src = _ttChunks[_ttCurChunk][0].video_url;
1762:function ttUpdatePlayhead() {
1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;
1765: const chunk = _ttChunks[_ttCurChunk];
Read
index.html
index.html
(lines 1754-1793)
Thinking
Thinking
Read
index.html
index.html
(lines 1701-1760)
Thinking
Thinking
Read
index.html
index.html
(lines 1561-1640)
Thinking
Thinking
Bash
Find time formatting functions
IN
grep -n "function fmtTime\|function fmtDate\|function _fmt\|localTimeToUtc\|fmtDateTime" /volume1/screenpipe/app/static/index.html | head -20
Copy code to clipboard
OUT...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Explorer (⇧⌘E)","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"","depth":22,"role_description":"text"},{"role":"AXRadioButton","text":"Search (⇧⌘F)","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"role_description":"text"},{"role":"AXRadioButton","text":"Source Control (⌃⇧G) - 2 pending changes","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":22,"role_description":"text"},{"role":"AXRadioButton","text":"Run and Debug (⇧⌘D)","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"role_description":"text"},{"role":"AXRadioButton","text":"Remote Explorer","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"role_description":"text"},{"role":"AXRadioButton","text":"Extensions (⇧⌘X) - 2 require update, 1 requires restart","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":22,"role_description":"text"},{"role":"AXRadioButton","text":"Claude Code","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"Containers","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"EXPLORER","depth":17,"role_description":"heading"},{"role":"AXStaticText","text":"EXPLORER","depth":18,"role_description":"text"},{"role":"AXButton","text":"Explorer Section: screenpipe [SSH: nas]","depth":21,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXHeading","text":"Explorer Section: screenpipe [SSH: nas]","depth":22,"role_description":"heading"},{"role":"AXStaticText","text":"SCREENPIPE [SSH: NAS]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"#recycle","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"app","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"data","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"pipes","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":".gitignore","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"app_settings.json","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"archive.db","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"db.sqlite","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"screenpipe_sync.sh","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"screenpipe.db","depth":27,"role_description":"text"},{"role":"AXButton","text":"Outline Section","depth":21,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXHeading","text":"OUTLINE","depth":22,"role_description":"heading"},{"role":"AXStaticText","text":"OUTLINE","depth":23,"role_description":"text"},{"role":"AXButton","text":"Timeline Section","depth":21,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXHeading","text":"TIMELINE","depth":22,"role_description":"heading"},{"role":"AXStaticText","text":"TIMELINE","depth":23,"role_description":"text"},{"role":"AXRadioButton","text":"app_settings.json, Editor Group 1","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe_sync.sh, Editor Group 1","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":"db.sqlite-shm, preview, Editor Group 1","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/Test/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","depth":28,"value":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/Test/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","role_description":"editor","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/Test/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","depth":29,"role_description":"text"},{"role":"AXRadioButton","text":"lets add ability to jump…, Editor Group 2","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":"Problems (⇧⌘M)","depth":22,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PROBLEMS","depth":24,"role_description":"text"},{"role":"AXRadioButton","text":"Output (⇧⌘U)","depth":22,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUTPUT","depth":24,"role_description":"text"},{"role":"AXRadioButton","text":"Debug Console (⇧⌘Y)","depth":22,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"DEBUG CONSOLE","depth":24,"role_description":"text"},{"role":"AXRadioButton","text":"Terminal (⌃`)","depth":22,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"TERMINAL","depth":24,"role_description":"text"},{"role":"AXRadioButton","text":"Ports","depth":22,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PORTS","depth":24,"role_description":"text"},{"role":"AXButton","text":"remote SSH: nas","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"SSH: nas","depth":17,"role_description":"text"},{"role":"AXButton","text":"screenpipe (Git) - master*, Checkout Branch/Tag...","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"master*","depth":17,"role_description":"text"},{"role":"AXButton","text":"screenpipe (Git) - Synchronize Changes","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"No Problems","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"role_description":"text"},{"role":"AXButton","text":"No Ports Forwarded","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"role_description":"text"},{"role":"AXButton","text":"Notifications","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Signed out","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"Signed out","depth":17,"role_description":"text"},{"role":"AXButton","text":"Shell Script","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"LF","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"UTF-8","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Spaces: 2","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Ln 320, Col 36","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Screen Reader Optimized","depth":16,"bounds":{"left":1.0,"top":0.0,"width":-0.07500005,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"git-commit Lukas Kovalik (23 hours ago)","depth":16,"bounds":{"left":0.9388889,"top":0.0,"width":0.061111093,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.9423611,"top":0.0,"width":0.011805556,"height":0.017777778},"role_description":"text"},{"role":"AXStaticText","text":"Lukas Kovalik (23 hours ago)","depth":17,"bounds":{"left":0.9534722,"top":0.0,"width":0.046527803,"height":0.015555556},"role_description":"text"},{"role":"AXStaticText","text":"Info: Downloading VS Code Server...","depth":12,"role_description":"text"},{"role":"AXButton","text":"lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time","depth":19,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Session history","depth":19,"help_text":"Session history","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New session","depth":19,"help_text":"New session","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Message actions","depth":24,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.\n\nSummary:\n1. Primary Request and Intent:\n\nThe user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:\n- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.\n- **Q2**: AND combination search (term1 + term2 must both appear) → Added \"AND also\" input field.\n- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.\n- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.\n- **Q5**: \"still the same\" (container not picking up config) → Explained `up -d` vs `restart`.\n- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.\n- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.\n- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.\n- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.\n\n2. Key Technical Concepts:\n\n- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.\n- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.\n- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.\n- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.\n- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.\n- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.\n- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.\n- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.\n- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.\n- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.\n- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\\#recycle/`.\n\n3. Files and Code Sections:\n\n- **`/volume1/screenpipe/app/main.py`**\n - Added `/api/apps` endpoint (all unique app names from frames table)\n - Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)\n - `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: \"...\"}`\n - Key snippet:\n ```python","depth":26,"role_description":"text"},{"role":"AXButton","text":"@app.get(\"/api/timetable\"","depth":26,"help_text":"Open app.get(\"/api/timetable\"","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":")\n async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):\n ...\n rows = conn.execute(f\"\"\"\n SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,\n f.offset_index, f.snapshot_path,\n vc.file_path AS video_path, vc.fps AS video_fps\n FROM frames f\n JOIN video_chunks vc ON f.video_chunk_id = vc.id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND f.video_chunk_id IS NOT NULL {dev_clause}\n ORDER BY f.timestamp\n \"\"\", params).fetchall()\n # seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)\n ```\n\n- **`/volume1/screenpipe/app/docker-compose.yml`**\n - Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`\n - Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`\n - screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`\n\n- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)\n - **Search enhancements**:\n - Added `id=\"sq2\"` \"AND also\" input between search-row1 and search-row2\n - Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id=\"msOnlyApps\"`, `id=\"msSkipApps\"`)\n - Updated `buildUrl()` to combine `q + \" \" + q2` and convert times with `localTimeToUtc()`\n - Added `fmtDateTime(ts)` showing \"Apr 20 14:08\" format\n - Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC\n - Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`\n - **Timetable tab** (new page):\n - Tab button added between Work Report and AI Summary\n - `showPage` array updated: `['activity','search','audio','report','timetable','summary']`\n - `refresh()` calls `loadTimetable()` when on timetable page\n - **Timetable CSS** (key styles):\n ```css\n .tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }\n .tt-inner { position:relative; height:52px; } /* width set dynamically */\n .tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n .tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n .tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }\n .tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }\n ```\n - **Timetable JS state variables**:\n ```javascript\n let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;\n let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;\n const _ttAppColors = {};\n const TT_ZOOMS = [1, 2, 4, 8, 16, 32];\n const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};\n ```\n - **Key JS functions**:\n - `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders\n - `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead\n - `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)\n - `ttOverviewClick(e)` — scrolls timeline + seeks video\n - `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`\n - `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`\n - `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video\n - `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked\n - `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`\n - `_ttShowNow(f)` — updates screenshot thumbnail + now-text div\n - `ttSyncBtn()` — syncs play/pause button text\n - Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom\n\n- **`/volume1/screenpipe/.gitignore`**\n ```\n *.db, *.sqlite, *.sqlite-shm, *.sqlite-wal\n data/, \\#recycle/,","depth":26,"role_description":"text"},{"role":"AXButton","text":"@eaDir/","depth":26,"help_text":"Open eaDir/","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"app_settings.json, app/.env\n __pycache__/, *.pyc, .DS_Store\n ```\n\n4. Errors and Fixes:\n\n- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\\#recycle/`. Also had to `git rm --cached \"#recycle/desktop.ini\"` to unstage it.\n- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.\n- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.\n- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.\n- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.\n\n5. Problem Solving:\n\n- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.\n- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.\n- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).\n- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.\n\n6. All User Messages:\n\n- \"do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps.\"\n- \"doi I need to restart?\"\n- \"there is sudo docker compose\"\n- \"no still the same\"\n- \"add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git\"\n- \"just do it\" (re: git push)\n- \"how to make sure data in :8767 are accurate and point to archive.db\"\n- \"I can't see older than 16th there should 21st of april. In http://192.168.0.242:8766/ I can see all but not on sqlite viewer http://192.168.0.242:8767\"\n- \"ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive\"\n- [docker compose output showing orphan container error]\n- \"looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast\"\n- \"lets make the playing speed more than 8x\"\n- \"still playing speed is not showing properly still just in one second. also I want to see in timeline where I am\"\n\n7. Pending Tasks:\n\n- **Playback speed fix** (in progress, partially done):\n - Add `<div class=\"tt-playhead-time\" id=\"ttPlayheadTime\"></div>` inside `ttInner` HTML\n - Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions\n - Update speed select `onchange` to call `ttSetSpeed(+this.value)`\n - Add 64× option to speed select\n - Update `_ttMovePlayhead` to also update `ttPlayheadTime` label\n - Update `ttSyncBtn` to start/stop timer based on play state + speed\n - Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)\n - Rebuild Docker image after changes\n\n8. Current Work:\n\nWorking on fixing two issues with the Timetable tab:\n1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.\n2. **Timeline position indicator**: Playhead not prominent enough. \n\n**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:\n```css\n.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n```\n\nSession was interrupted by summary request after this CSS edit, mid-implementation.\n\n9. Optional Next Step:\n\nContinuing the fix for: \"still playing speed is not showing properly still just in one second. also I want to see in timeline where I am\"\n\nThe next steps in order are:\n1. Add `<div class=\"tt-playhead-time\" id=\"ttPlayheadTime\"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)\n2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`\n3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)\n4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option\n5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer\n6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`\n\nIf you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl\nContinue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with \"I'll continue\" or similar. Pick up the last task as if the break never happened.","depth":26,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find timetable speed and playhead related code","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"tt-playhead\\|ttPlayhead\\|ttInner\\|_ttMovePlayhead\\|ttSetSpeed\\|_ttStartSpeed\\|_ttStopSpeed\\|ttSyncBtn\\|playbackRate\\|speed.*select\\|spdSel\\|ttSpeed\" /volume1/screenpipe/app/static/index.html | head -80","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n580: <div class=\"tt-inner\" id=\"ttInner\" onclick=\"ttTimelineClick(event)\">\n583: <div class=\"tt-playhead\" id=\"ttPlayhead\"></div>\n598: onpause=\"ttSyncBtn()\"\n599: onplay=\"ttSyncBtn()\">\n607: <select id=\"ttSpeed\" onchange=\"document.getElementById('ttVideo').playbackRate=+this.value\">\n1624: document.getElementById('ttInner').style.width = '100%';\n1632: document.getElementById('ttPlayhead').style.display = 'none';\n1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';\n1700: const inner = document.getElementById('ttInner');\n1710: const inner = document.getElementById('ttInner');\n1718: const inner = document.getElementById('ttInner');\n1750: _ttMovePlayhead(new Date(best.ts).getTime());\n1772: _ttMovePlayhead(new Date(best.ts).getTime());\n1791:function _ttMovePlayhead(tsMs) {\n1792: const ph = document.getElementById('ttPlayhead');\n1802: const ph = document.getElementById('ttPlayhead');\n1805: const inner = document.getElementById('ttInner');\n1819:function ttSyncBtn() {","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 576-625)","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1786-1865)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find chunk loading and playhead update functions","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"ttUpdatePlayhead\\|ttNextChunk\\|ttLoadChunk\\|_ttCurChunk\\|_ttChunks\\|_ttFrames\" /volume1/screenpipe/app/static/index.html | head -50","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"596: onended=\"ttNextChunk()\"\n597: ontimeupdate=\"ttUpdatePlayhead()\"\n1569:let _ttFrames = [];\n1570:let _ttChunks = [];\n1571:let _ttCurChunk = -1;\n1607: _ttFrames = data.frames;\n1609: for (const f of _ttFrames) {\n1613: _ttChunks = [...chunkMap.values()];\n1614: _ttCurChunk = -1;\n1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();\n1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();\n1620: for (const f of _ttFrames) _ttColor(f.app);\n1640: for (const f of _ttFrames) {\n1736: if (!_ttFrames.length) return;\n1737: let best = _ttFrames[0], minDiff = Infinity;\n1738: for (const f of _ttFrames) {\n1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);\n1744: _ttCurChunk = ci;\n1753:function ttNextChunk() {\n1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;\n1755: _ttCurChunk++;\n1757: video.src = _ttChunks[_ttCurChunk][0].video_url;\n1762:function ttUpdatePlayhead() {\n1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;\n1765: const chunk = _ttChunks[_ttCurChunk];","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1754-1793)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1701-1760)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1561-1640)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find time formatting functions","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"function fmtTime\\|function fmtDate\\|function _fmt\\|localTimeToUtc\\|fmtDateTime\" /volume1/screenpipe/app/static/index.html | head -20","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"role_description":"text"}]...
|
-9211766644227580523
|
4474475550963076503
|
click
|
accessibility
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G) - 2 pending changes
2
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: nas]
Explorer Section: screenpipe [SSH: nas]
SCREENPIPE [SSH: NAS]
#recycle
app
data
pipes
.gitignore
app_settings.json
archive.db
db.sqlite
screenpipe_sync.sh
screenpipe.db
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
app_settings.json, Editor Group 1
screenpipe_sync.sh, Editor Group 1
db.sqlite-shm, preview, Editor Group 1
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lets add ability to jump…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: nas
SSH: nas
screenpipe (Git) - master*, Checkout Branch/Tag...
master*
screenpipe (Git) - Synchronize Changes
No Problems
0
0
No Ports Forwarded
0
Notifications
Signed out
Signed out
Shell Script
Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions
LF
UTF-8
Spaces: 2
Ln 320, Col 36
Screen Reader Optimized
git-commit Lukas Kovalik (23 hours ago)
Lukas Kovalik (23 hours ago)
Info: Downloading VS Code Server...
lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time
Session history
New session
Message actions
This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.
Summary:
1. Primary Request and Intent:
The user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:
- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.
- **Q2**: AND combination search (term1 + term2 must both appear) → Added "AND also" input field.
- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.
- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.
- **Q5**: "still the same" (container not picking up config) → Explained `up -d` vs `restart`.
- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.
- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.
- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.
- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.
2. Key Technical Concepts:
- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.
- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.
- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.
- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.
- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.
- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.
- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.
- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.
- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.
- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.
- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\#recycle/`.
3. Files and Code Sections:
- **`/volume1/screenpipe/app/main.py`**
- Added `/api/apps` endpoint (all unique app names from frames table)
- Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)
- `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: "..."}`
- Key snippet:
```python
@app.get("/api/timetable"
)
async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):
...
rows = conn.execute(f"""
SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,
f.offset_index, f.snapshot_path,
vc.file_path AS video_path, vc.fps AS video_fps
FROM frames f
JOIN video_chunks vc ON f.video_chunk_id = vc.id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND f.video_chunk_id IS NOT NULL {dev_clause}
ORDER BY f.timestamp
""", params).fetchall()
# seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)
```
- **`/volume1/screenpipe/app/docker-compose.yml`**
- Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`
- Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`
- screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`
- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)
- **Search enhancements**:
- Added `id="sq2"` "AND also" input between search-row1 and search-row2
- Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id="msOnlyApps"`, `id="msSkipApps"`)
- Updated `buildUrl()` to combine `q + " " + q2` and convert times with `localTimeToUtc()`
- Added `fmtDateTime(ts)` showing "Apr 20 14:08" format
- Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC
- Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`
- **Timetable tab** (new page):
- Tab button added between Work Report and AI Summary
- `showPage` array updated: `['activity','search','audio','report','timetable','summary']`
- `refresh()` calls `loadTimetable()` when on timetable page
- **Timetable CSS** (key styles):
```css
.tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }
.tt-inner { position:relative; height:52px; } /* width set dynamically */
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
.tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }
.tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }
```
- **Timetable JS state variables**:
```javascript
let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;
let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;
const _ttAppColors = {};
const TT_ZOOMS = [1, 2, 4, 8, 16, 32];
const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};
```
- **Key JS functions**:
- `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders
- `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead
- `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)
- `ttOverviewClick(e)` — scrolls timeline + seeks video
- `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`
- `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`
- `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video
- `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked
- `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`
- `_ttShowNow(f)` — updates screenshot thumbnail + now-text div
- `ttSyncBtn()` — syncs play/pause button text
- Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom
- **`/volume1/screenpipe/.gitignore`**
```
*.db, *.sqlite, *.sqlite-shm, *.sqlite-wal
data/, \#recycle/,
@eaDir/
app_settings.json, app/.env
__pycache__/, *.pyc, .DS_Store
```
4. Errors and Fixes:
- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\#recycle/`. Also had to `git rm --cached "#recycle/desktop.ini"` to unstage it.
- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.
- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.
- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.
- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.
5. Problem Solving:
- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.
- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.
- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).
- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.
6. All User Messages:
- "do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps."
- "doi I need to restart?"
- "there is sudo docker compose"
- "no still the same"
- "add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git"
- "just do it" (re: git push)
- "how to make sure data in :8767 are accurate and point to archive.db"
- "I can't see older than 16th there should 21st of april. In http://[IP_ADDRESS]:8766/ I can see all but not on sqlite viewer http://[IP_ADDRESS]:8767"
- "ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive"
- [docker compose output showing orphan container error]
- "looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast"
- "lets make the playing speed more than 8x"
- "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
7. Pending Tasks:
- **Playback speed fix** (in progress, partially done):
- Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` inside `ttInner` HTML
- Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions
- Update speed select `onchange` to call `ttSetSpeed(+this.value)`
- Add 64× option to speed select
- Update `_ttMovePlayhead` to also update `ttPlayheadTime` label
- Update `ttSyncBtn` to start/stop timer based on play state + speed
- Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)
- Rebuild Docker image after changes
8. Current Work:
Working on fixing two issues with the Timetable tab:
1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.
2. **Timeline position indicator**: Playhead not prominent enough.
**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:
```css
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
```
Session was interrupted by summary request after this CSS edit, mid-implementation.
9. Optional Next Step:
Continuing the fix for: "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
The next steps in order are:
1. Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)
2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`
3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)
4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option
5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer
6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`
If you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl
Continue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with "I'll continue" or similar. Pick up the last task as if the break never happened.
Thinking
Thinking
Bash
Find timetable speed and playhead related code
IN
grep -n "tt-playhead\|ttPlayhead\|ttInner\|_ttMovePlayhead\|ttSetSpeed\|_ttStartSpeed\|_ttStopSpeed\|ttSyncBtn\|playbackRate\|speed.*select\|spdSel\|ttSpeed" /volume1/screenpipe/app/static/index.html | head -80
Copy code to clipboard
OUT
207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
580: <div class="tt-inner" id="ttInner" onclick="ttTimelineClick(event)">
583: <div class="tt-playhead" id="ttPlayhead"></div>
598: onpause="ttSyncBtn()"
599: onplay="ttSyncBtn()">
607: <select id="ttSpeed" onchange="document.getElementById('ttVideo').playbackRate=+this.value">
1624: document.getElementById('ttInner').style.width = '100%';
1632: document.getElementById('ttPlayhead').style.display = 'none';
1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';
1700: const inner = document.getElementById('ttInner');
1710: const inner = document.getElementById('ttInner');
1718: const inner = document.getElementById('ttInner');
1750: _ttMovePlayhead(new Date(best.ts).getTime());
1772: _ttMovePlayhead(new Date(best.ts).getTime());
1791:function _ttMovePlayhead(tsMs) {
1792: const ph = document.getElementById('ttPlayhead');
1802: const ph = document.getElementById('ttPlayhead');
1805: const inner = document.getElementById('ttInner');
1819:function ttSyncBtn() {
Read
index.html
index.html
(lines 576-625)
Read
index.html
index.html
(lines 1786-1865)
Thinking
Thinking
Bash
Find chunk loading and playhead update functions
IN
grep -n "ttUpdatePlayhead\|ttNextChunk\|ttLoadChunk\|_ttCurChunk\|_ttChunks\|_ttFrames" /volume1/screenpipe/app/static/index.html | head -50
Copy code to clipboard
OUT
596: onended="ttNextChunk()"
597: ontimeupdate="ttUpdatePlayhead()"
1569:let _ttFrames = [];
1570:let _ttChunks = [];
1571:let _ttCurChunk = -1;
1607: _ttFrames = data.frames;
1609: for (const f of _ttFrames) {
1613: _ttChunks = [...chunkMap.values()];
1614: _ttCurChunk = -1;
1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();
1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();
1620: for (const f of _ttFrames) _ttColor(f.app);
1640: for (const f of _ttFrames) {
1736: if (!_ttFrames.length) return;
1737: let best = _ttFrames[0], minDiff = Infinity;
1738: for (const f of _ttFrames) {
1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);
1744: _ttCurChunk = ci;
1753:function ttNextChunk() {
1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;
1755: _ttCurChunk++;
1757: video.src = _ttChunks[_ttCurChunk][0].video_url;
1762:function ttUpdatePlayhead() {
1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;
1765: const chunk = _ttChunks[_ttCurChunk];
Read
index.html
index.html
(lines 1754-1793)
Thinking
Thinking
Read
index.html
index.html
(lines 1701-1760)
Thinking
Thinking
Read
index.html
index.html
(lines 1561-1640)
Thinking
Thinking
Bash
Find time formatting functions
IN
grep -n "function fmtTime\|function fmtDate\|function _fmt\|localTimeToUtc\|fmtDateTime" /volume1/screenpipe/app/static/index.html | head -20
Copy code to clipboard
OUT...
|
81023
|
NULL
|
|
81026
|
2157
|
12
|
2026-04-25T15:56:21.192278+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-25/1777 /Users/lukas/.screenpipe/data/data/2026-04-25/1777132581192_m2.jpg...
|
Code
|
screenpipe_sync.sh — screenpipe [SSH: nas]
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G) - 2 pending changes
2
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: nas]
Explorer Section: screenpipe [SSH: nas]
SCREENPIPE [SSH: NAS]
#recycle
app
data
pipes
.gitignore
app_settings.json
archive.db
db.sqlite
screenpipe_sync.sh
screenpipe.db
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
app_settings.json, Editor Group 1
screenpipe_sync.sh, Editor Group 1
db.sqlite-shm, preview, Editor Group 1
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lets add ability to jump…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: nas
SSH: nas
screenpipe (Git) - master*, Checkout Branch/Tag...
master*
screenpipe (Git) - Synchronize Changes
No Problems
0
0
No Ports Forwarded
0
Notifications
Signed out
Signed out
Shell Script
Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions
LF
UTF-8
Spaces: 2
Ln 320, Col 36
Screen Reader Optimized
git-commit Lukas Kovalik (23 hours ago)
Lukas Kovalik (23 hours ago)
Info: Downloading VS Code Server...
lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time
Session history
New session
Message actions
This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.
Summary:
1. Primary Request and Intent:
The user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:
- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.
- **Q2**: AND combination search (term1 + term2 must both appear) → Added "AND also" input field.
- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.
- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.
- **Q5**: "still the same" (container not picking up config) → Explained `up -d` vs `restart`.
- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.
- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.
- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.
- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.
2. Key Technical Concepts:
- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.
- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.
- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.
- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.
- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.
- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.
- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.
- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.
- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.
- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.
- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\#recycle/`.
3. Files and Code Sections:
- **`/volume1/screenpipe/app/main.py`**
- Added `/api/apps` endpoint (all unique app names from frames table)
- Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)
- `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: "..."}`
- Key snippet:
```python
@app.get("/api/timetable"
)
async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):
...
rows = conn.execute(f"""
SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,
f.offset_index, f.snapshot_path,
vc.file_path AS video_path, vc.fps AS video_fps
FROM frames f
JOIN video_chunks vc ON f.video_chunk_id = vc.id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND f.video_chunk_id IS NOT NULL {dev_clause}
ORDER BY f.timestamp
""", params).fetchall()
# seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)
```
- **`/volume1/screenpipe/app/docker-compose.yml`**
- Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`
- Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`
- screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`
- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)
- **Search enhancements**:
- Added `id="sq2"` "AND also" input between search-row1 and search-row2
- Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id="msOnlyApps"`, `id="msSkipApps"`)
- Updated `buildUrl()` to combine `q + " " + q2` and convert times with `localTimeToUtc()`
- Added `fmtDateTime(ts)` showing "Apr 20 14:08" format
- Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC
- Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`
- **Timetable tab** (new page):
- Tab button added between Work Report and AI Summary
- `showPage` array updated: `['activity','search','audio','report','timetable','summary']`
- `refresh()` calls `loadTimetable()` when on timetable page
- **Timetable CSS** (key styles):
```css
.tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }
.tt-inner { position:relative; height:52px; } /* width set dynamically */
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
.tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }
.tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }
```
- **Timetable JS state variables**:
```javascript
let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;
let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;
const _ttAppColors = {};
const TT_ZOOMS = [1, 2, 4, 8, 16, 32];
const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};
```
- **Key JS functions**:
- `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders
- `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead
- `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)
- `ttOverviewClick(e)` — scrolls timeline + seeks video
- `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`
- `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`
- `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video
- `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked
- `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`
- `_ttShowNow(f)` — updates screenshot thumbnail + now-text div
- `ttSyncBtn()` — syncs play/pause button text
- Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom
- **`/volume1/screenpipe/.gitignore`**
```
*.db, *.sqlite, *.sqlite-shm, *.sqlite-wal
data/, \#recycle/,
@eaDir/
app_settings.json, app/.env
__pycache__/, *.pyc, .DS_Store
```
4. Errors and Fixes:
- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\#recycle/`. Also had to `git rm --cached "#recycle/desktop.ini"` to unstage it.
- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.
- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.
- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.
- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.
5. Problem Solving:
- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.
- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.
- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).
- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.
6. All User Messages:
- "do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps."
- "doi I need to restart?"
- "there is sudo docker compose"
- "no still the same"
- "add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git"
- "just do it" (re: git push)
- "how to make sure data in :8767 are accurate and point to archive.db"
- "I can't see older than 16th there should 21st of april. In http://[IP_ADDRESS]:8766/ I can see all but not on sqlite viewer http://[IP_ADDRESS]:8767"
- "ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive"
- [docker compose output showing orphan container error]
- "looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast"
- "lets make the playing speed more than 8x"
- "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
7. Pending Tasks:
- **Playback speed fix** (in progress, partially done):
- Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` inside `ttInner` HTML
- Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions
- Update speed select `onchange` to call `ttSetSpeed(+this.value)`
- Add 64× option to speed select
- Update `_ttMovePlayhead` to also update `ttPlayheadTime` label
- Update `ttSyncBtn` to start/stop timer based on play state + speed
- Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)
- Rebuild Docker image after changes
8. Current Work:
Working on fixing two issues with the Timetable tab:
1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.
2. **Timeline position indicator**: Playhead not prominent enough.
**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:
```css
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
```
Session was interrupted by summary request after this CSS edit, mid-implementation.
9. Optional Next Step:
Continuing the fix for: "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
The next steps in order are:
1. Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)
2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`
3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)
4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option
5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer
6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`
If you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl
Continue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with "I'll continue" or similar. Pick up the last task as if the break never happened.
Thinking
Thinking
Bash
Find timetable speed and playhead related code
IN
grep -n "tt-playhead\|ttPlayhead\|ttInner\|_ttMovePlayhead\|ttSetSpeed\|_ttStartSpeed\|_ttStopSpeed\|ttSyncBtn\|playbackRate\|speed.*select\|spdSel\|ttSpeed" /volume1/screenpipe/app/static/index.html | head -80
Copy code to clipboard
OUT
207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
580: <div class="tt-inner" id="ttInner" onclick="ttTimelineClick(event)">
583: <div class="tt-playhead" id="ttPlayhead"></div>
598: onpause="ttSyncBtn()"
599: onplay="ttSyncBtn()">
607: <select id="ttSpeed" onchange="document.getElementById('ttVideo').playbackRate=+this.value">
1624: document.getElementById('ttInner').style.width = '100%';
1632: document.getElementById('ttPlayhead').style.display = 'none';
1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';
1700: const inner = document.getElementById('ttInner');
1710: const inner = document.getElementById('ttInner');
1718: const inner = document.getElementById('ttInner');
1750: _ttMovePlayhead(new Date(best.ts).getTime());
1772: _ttMovePlayhead(new Date(best.ts).getTime());
1791:function _ttMovePlayhead(tsMs) {
1792: const ph = document.getElementById('ttPlayhead');
1802: const ph = document.getElementById('ttPlayhead');
1805: const inner = document.getElementById('ttInner');
1819:function ttSyncBtn() {
Read
index.html
index.html
(lines 576-625)
Read
index.html
index.html
(lines 1786-1865)
Thinking
Thinking
Bash
Find chunk loading and playhead update functions
IN
grep -n "ttUpdatePlayhead\|ttNextChunk\|ttLoadChunk\|_ttCurChunk\|_ttChunks\|_ttFrames" /volume1/screenpipe/app/static/index.html | head -50
Copy code to clipboard
OUT
596: onended="ttNextChunk()"
597: ontimeupdate="ttUpdatePlayhead()"
1569:let _ttFrames = [];
1570:let _ttChunks = [];
1571:let _ttCurChunk = -1;
1607: _ttFrames = data.frames;
1609: for (const f of _ttFrames) {
1613: _ttChunks = [...chunkMap.values()];
1614: _ttCurChunk = -1;
1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();
1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();
1620: for (const f of _ttFrames) _ttColor(f.app);
1640: for (const f of _ttFrames) {
1736: if (!_ttFrames.length) return;
1737: let best = _ttFrames[0], minDiff = Infinity;
1738: for (const f of _ttFrames) {
1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);
1744: _ttCurChunk = ci;
1753:function ttNextChunk() {
1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;
1755: _ttCurChunk++;
1757: video.src = _ttChunks[_ttCurChunk][0].video_url;
1762:function ttUpdatePlayhead() {
1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;
1765: const chunk = _ttChunks[_ttCurChunk];
Read
index.html
index.html
(lines 1754-1793)
Thinking
Thinking
Read
index.html
index.html
(lines 1701-1760)
Thinking
Thinking
Read
index.html
index.html
(lines 1561-1640)
Thinking
Thinking
Bash
Find time formatting functions
IN
grep -n "function fmtTime\|function fmtDate\|function _fmt\|localTimeToUtc\|fmtDateTime" /volume1/screenpipe/app/static/index.html | head -20
Copy code to clipboard
OUT
1088: if (tf) url += `&time_from=${localTimeToUtc(tf)}`;
1089: if (tt) url += `&time_to=${localTimeToUtc(tt)}`;
1153: let meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge}`;
1166: meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge} <span class="badge ${r.is_input_device?'mic':'sys'}">${r.is_input_device?'MIC':'SYS'}</span>`;
1307:function fmtTime(ts) {
1312:function fmtDateTime(ts) {
1320:function localTimeToUtc(timeStr) {
1778:function _fmtSec(s) {
1788: `${fmtDateTime(f.ts)} · ${f.app}${f.win ? ' / ' + f.win : ''}`;
Read
index.html
index.html
(lines 1308-1327)
Thinking
Thinking
Now I have everything I need. I'll implement the frame-by-frame timer system that replaces
video.playbackRate
with wall-clock accurate playback, plus add the playhead time label. Let me make the changes:
Edit
index.html
index.html
Added 1 line...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Explorer (⇧⌘E)","depth":19,"bounds":{"left":0.0,"top":0.047885075,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.057462092,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXRadioButton","text":"Search (⇧⌘F)","depth":19,"bounds":{"left":0.0,"top":0.08619314,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.09577015,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXRadioButton","text":"Source Control (⌃⇧G) - 2 pending changes","depth":19,"bounds":{"left":0.0,"top":0.1245012,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.13407822,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXStaticText","text":"2","depth":22,"bounds":{"left":0.009640957,"top":0.1452514,"width":0.0019946808,"height":0.008778931},"role_description":"text"},{"role":"AXRadioButton","text":"Run and Debug (⇧⌘D)","depth":19,"bounds":{"left":0.0,"top":0.16280925,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.17238627,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXRadioButton","text":"Remote Explorer","depth":19,"bounds":{"left":0.0,"top":0.20111732,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.21069433,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXRadioButton","text":"Extensions (⇧⌘X) - 2 require update, 1 requires restart","depth":19,"bounds":{"left":0.0,"top":0.23942538,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.2490024,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXStaticText","text":"3","depth":22,"bounds":{"left":0.00930851,"top":0.2601756,"width":0.0023271276,"height":0.008778931},"role_description":"text"},{"role":"AXRadioButton","text":"Claude Code","depth":19,"bounds":{"left":0.0,"top":0.27773345,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"Containers","depth":19,"bounds":{"left":0.0,"top":0.3160415,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"EXPLORER","depth":17,"bounds":{"left":0.022606382,"top":0.047885075,"width":0.018949468,"height":0.02793296},"role_description":"heading"},{"role":"AXStaticText","text":"EXPLORER","depth":18,"bounds":{"left":0.022606382,"top":0.056664005,"width":0.018949468,"height":0.0103751},"role_description":"text"},{"role":"AXButton","text":"Explorer Section: screenpipe [SSH: nas]","depth":21,"bounds":{"left":0.015957447,"top":0.07581804,"width":0.09940159,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.07821229,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXHeading","text":"Explorer Section: screenpipe [SSH: nas]","depth":22,"bounds":{"left":0.022606382,"top":0.07581804,"width":0.045877658,"height":0.017557861},"role_description":"heading"},{"role":"AXStaticText","text":"SCREENPIPE [SSH: NAS]","depth":23,"bounds":{"left":0.022606382,"top":0.079010375,"width":0.045877658,"height":0.0103751},"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.09577015,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"#recycle","depth":27,"bounds":{"left":0.025930852,"top":0.09577015,"width":0.017287234,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.11332801,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"app","depth":27,"bounds":{"left":0.025930852,"top":0.11332801,"width":0.0076462766,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.10605053,"top":0.11412609,"width":0.004654255,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.13088587,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"data","depth":27,"bounds":{"left":0.025930852,"top":0.13088587,"width":0.008976064,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.14844373,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"pipes","depth":27,"bounds":{"left":0.025930852,"top":0.14844373,"width":0.010970744,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.16440542,"width":0.0063164895,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":".gitignore","depth":27,"bounds":{"left":0.025930852,"top":0.1660016,"width":0.018949468,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.1819633,"width":0.0063164895,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"app_settings.json","depth":27,"bounds":{"left":0.025930852,"top":0.18355946,"width":0.03557181,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.19952115,"width":0.0076462766,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"archive.db","depth":27,"bounds":{"left":0.025930852,"top":0.20111732,"width":0.020944148,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.21707901,"width":0.0076462766,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"db.sqlite","depth":27,"bounds":{"left":0.025930852,"top":0.21867518,"width":0.017287234,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.23463687,"width":0.0063164895,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"screenpipe_sync.sh","depth":27,"bounds":{"left":0.025930852,"top":0.23623304,"width":0.039893616,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.25219473,"width":0.0076462766,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"screenpipe.db","depth":27,"bounds":{"left":0.025930852,"top":0.25379092,"width":0.028590426,"height":0.011971269},"role_description":"text"},{"role":"AXButton","text":"Outline Section","depth":21,"bounds":{"left":0.015957447,"top":0.9473264,"width":0.09940159,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.9497207,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXHeading","text":"OUTLINE","depth":22,"bounds":{"left":0.022606382,"top":0.9473264,"width":0.01662234,"height":0.017557861},"role_description":"heading"},{"role":"AXStaticText","text":"OUTLINE","depth":23,"bounds":{"left":0.022606382,"top":0.95131683,"width":0.01662234,"height":0.0103751},"role_description":"text"},{"role":"AXButton","text":"Timeline Section","depth":21,"bounds":{"left":0.015957447,"top":0.9648843,"width":0.09940159,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.96727854,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXHeading","text":"TIMELINE","depth":22,"bounds":{"left":0.022606382,"top":0.9648843,"width":0.01761968,"height":0.017557861},"role_description":"heading"},{"role":"AXStaticText","text":"TIMELINE","depth":23,"bounds":{"left":0.022606382,"top":0.9688747,"width":0.01761968,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"app_settings.json, Editor Group 1","depth":28,"bounds":{"left":0.11569149,"top":0.047885075,"width":0.055851065,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe_sync.sh, Editor Group 1","depth":28,"bounds":{"left":0.17154256,"top":0.047885075,"width":0.06050532,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":"db.sqlite-shm, preview, Editor Group 1","depth":28,"bounds":{"left":0.23171543,"top":0.047885075,"width":0.04886968,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/Test/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","depth":28,"bounds":{"left":0.13763298,"top":0.26815644,"width":0.38031915,"height":0.014365523},"value":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/Test/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","role_description":"editor","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/Test/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","depth":29,"bounds":{"left":0.13763298,"top":0.26815644,"width":0.35804522,"height":0.014365523},"role_description":"text"},{"role":"AXRadioButton","text":"lets add ability to jump…, Editor Group 2","depth":28,"bounds":{"left":0.5578458,"top":0.047885075,"width":0.06948138,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":"Problems (⇧⌘M)","depth":22,"bounds":{"left":0.118351065,"top":0.59936154,"width":0.027925532,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PROBLEMS","depth":24,"bounds":{"left":0.122340426,"top":0.60814047,"width":0.019946808,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Output (⇧⌘U)","depth":22,"bounds":{"left":0.14594415,"top":0.59936154,"width":0.023603724,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUTPUT","depth":24,"bounds":{"left":0.14993352,"top":0.60814047,"width":0.015625,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Debug Console (⇧⌘Y)","depth":22,"bounds":{"left":0.16921543,"top":0.59936154,"width":0.039893616,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"DEBUG CONSOLE","depth":24,"bounds":{"left":0.1732048,"top":0.60814047,"width":0.031914894,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Terminal (⌃`)","depth":22,"bounds":{"left":0.2087766,"top":0.59936154,"width":0.026595745,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"TERMINAL","depth":24,"bounds":{"left":0.21276596,"top":0.60814047,"width":0.01861702,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Ports","depth":22,"bounds":{"left":0.23537233,"top":0.59936154,"width":0.020279255,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PORTS","depth":24,"bounds":{"left":0.2393617,"top":0.60814047,"width":0.012300532,"height":0.0103751},"role_description":"text"},{"role":"AXButton","text":"remote SSH: nas","depth":16,"bounds":{"left":0.0006648936,"top":0.98244214,"width":0.028590426,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.0033244682,"top":0.9848364,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"SSH: nas","depth":17,"bounds":{"left":0.008643617,"top":0.9856345,"width":0.017952127,"height":0.011173184},"role_description":"text"},{"role":"AXButton","text":"screenpipe (Git) - master*, Checkout Branch/Tag...","depth":16,"bounds":{"left":0.030917553,"top":0.98244214,"width":0.023271276,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.031914894,"top":0.9848364,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"master*","depth":17,"bounds":{"left":0.03723404,"top":0.9856345,"width":0.015957447,"height":0.011173184},"role_description":"text"},{"role":"AXButton","text":"screenpipe (Git) - Synchronize Changes","depth":16,"bounds":{"left":0.05418883,"top":0.98244214,"width":0.00731383,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"No Problems","depth":16,"bounds":{"left":0.06416223,"top":0.98244214,"width":0.022606382,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.06582447,"top":0.9848364,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"bounds":{"left":0.07114362,"top":0.9856345,"width":0.004986702,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.07579787,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"bounds":{"left":0.08111702,"top":0.9856345,"width":0.0039893617,"height":0.011173184},"role_description":"text"},{"role":"AXButton","text":"No Ports Forwarded","depth":16,"bounds":{"left":0.08843085,"top":0.98244214,"width":0.012632979,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.09009308,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"bounds":{"left":0.09541223,"top":0.9856345,"width":0.0039893617,"height":0.011173184},"role_description":"text"},{"role":"AXButton","text":"Notifications","depth":16,"bounds":{"left":0.9886968,"top":0.98244214,"width":0.010638298,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Signed out","depth":16,"bounds":{"left":0.9567819,"top":0.98244214,"width":0.031914894,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.9594415,"top":0.9848364,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Signed out","depth":17,"bounds":{"left":0.96476066,"top":0.9856345,"width":0.021276595,"height":0.011173184},"role_description":"text"},{"role":"AXButton","text":"Shell Script","depth":16,"bounds":{"left":0.93151593,"top":0.98244214,"width":0.023603724,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions","depth":16,"bounds":{"left":0.92420214,"top":0.98244214,"width":0.0076462766,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"LF","depth":16,"bounds":{"left":0.91356385,"top":0.98244214,"width":0.00831117,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"UTF-8","depth":16,"bounds":{"left":0.8962766,"top":0.98244214,"width":0.015625,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Spaces: 2","depth":16,"bounds":{"left":0.87234044,"top":0.98244214,"width":0.021941489,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Ln 320, Col 36","depth":16,"bounds":{"left":0.8390958,"top":0.98244214,"width":0.03125,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Screen Reader Optimized","depth":16,"bounds":{"left":0.7849069,"top":0.98244214,"width":0.05319149,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"git-commit Lukas Kovalik (23 hours ago)","depth":16,"bounds":{"left":0.71974736,"top":0.98244214,"width":0.06416223,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.72140956,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Lukas Kovalik (23 hours ago)","depth":17,"bounds":{"left":0.72672874,"top":0.9856345,"width":0.055518616,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"Info: Downloading VS Code Server...","depth":12,"role_description":"text"},{"role":"AXButton","text":"lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time","depth":19,"bounds":{"left":0.56017286,"top":0.08060654,"width":0.099734046,"height":0.022346368},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Session history","depth":19,"bounds":{"left":0.9780585,"top":0.08060654,"width":0.00930851,"height":0.022346368},"help_text":"Session history","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New session","depth":19,"bounds":{"left":0.9886968,"top":0.08060654,"width":0.00930851,"height":0.022346368},"help_text":"New session","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Message actions","depth":24,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.\n\nSummary:\n1. Primary Request and Intent:\n\nThe user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:\n- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.\n- **Q2**: AND combination search (term1 + term2 must both appear) → Added \"AND also\" input field.\n- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.\n- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.\n- **Q5**: \"still the same\" (container not picking up config) → Explained `up -d` vs `restart`.\n- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.\n- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.\n- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.\n- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.\n\n2. Key Technical Concepts:\n\n- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.\n- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.\n- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.\n- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.\n- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.\n- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.\n- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.\n- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.\n- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.\n- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.\n- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\\#recycle/`.\n\n3. Files and Code Sections:\n\n- **`/volume1/screenpipe/app/main.py`**\n - Added `/api/apps` endpoint (all unique app names from frames table)\n - Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)\n - `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: \"...\"}`\n - Key snippet:\n ```python","depth":26,"role_description":"text"},{"role":"AXButton","text":"@app.get(\"/api/timetable\"","depth":26,"help_text":"Open app.get(\"/api/timetable\"","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":")\n async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):\n ...\n rows = conn.execute(f\"\"\"\n SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,\n f.offset_index, f.snapshot_path,\n vc.file_path AS video_path, vc.fps AS video_fps\n FROM frames f\n JOIN video_chunks vc ON f.video_chunk_id = vc.id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND f.video_chunk_id IS NOT NULL {dev_clause}\n ORDER BY f.timestamp\n \"\"\", params).fetchall()\n # seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)\n ```\n\n- **`/volume1/screenpipe/app/docker-compose.yml`**\n - Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`\n - Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`\n - screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`\n\n- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)\n - **Search enhancements**:\n - Added `id=\"sq2\"` \"AND also\" input between search-row1 and search-row2\n - Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id=\"msOnlyApps\"`, `id=\"msSkipApps\"`)\n - Updated `buildUrl()` to combine `q + \" \" + q2` and convert times with `localTimeToUtc()`\n - Added `fmtDateTime(ts)` showing \"Apr 20 14:08\" format\n - Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC\n - Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`\n - **Timetable tab** (new page):\n - Tab button added between Work Report and AI Summary\n - `showPage` array updated: `['activity','search','audio','report','timetable','summary']`\n - `refresh()` calls `loadTimetable()` when on timetable page\n - **Timetable CSS** (key styles):\n ```css\n .tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }\n .tt-inner { position:relative; height:52px; } /* width set dynamically */\n .tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n .tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n .tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }\n .tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }\n ```\n - **Timetable JS state variables**:\n ```javascript\n let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;\n let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;\n const _ttAppColors = {};\n const TT_ZOOMS = [1, 2, 4, 8, 16, 32];\n const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};\n ```\n - **Key JS functions**:\n - `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders\n - `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead\n - `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)\n - `ttOverviewClick(e)` — scrolls timeline + seeks video\n - `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`\n - `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`\n - `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video\n - `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked\n - `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`\n - `_ttShowNow(f)` — updates screenshot thumbnail + now-text div\n - `ttSyncBtn()` — syncs play/pause button text\n - Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom\n\n- **`/volume1/screenpipe/.gitignore`**\n ```\n *.db, *.sqlite, *.sqlite-shm, *.sqlite-wal\n data/, \\#recycle/,","depth":26,"role_description":"text"},{"role":"AXButton","text":"@eaDir/","depth":26,"help_text":"Open eaDir/","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"app_settings.json, app/.env\n __pycache__/, *.pyc, .DS_Store\n ```\n\n4. Errors and Fixes:\n\n- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\\#recycle/`. Also had to `git rm --cached \"#recycle/desktop.ini\"` to unstage it.\n- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.\n- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.\n- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.\n- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.\n\n5. Problem Solving:\n\n- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.\n- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.\n- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).\n- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.\n\n6. All User Messages:\n\n- \"do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps.\"\n- \"doi I need to restart?\"\n- \"there is sudo docker compose\"\n- \"no still the same\"\n- \"add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git\"\n- \"just do it\" (re: git push)\n- \"how to make sure data in :8767 are accurate and point to archive.db\"\n- \"I can't see older than 16th there should 21st of april. In http://192.168.0.242:8766/ I can see all but not on sqlite viewer http://192.168.0.242:8767\"\n- \"ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive\"\n- [docker compose output showing orphan container error]\n- \"looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast\"\n- \"lets make the playing speed more than 8x\"\n- \"still playing speed is not showing properly still just in one second. also I want to see in timeline where I am\"\n\n7. Pending Tasks:\n\n- **Playback speed fix** (in progress, partially done):\n - Add `<div class=\"tt-playhead-time\" id=\"ttPlayheadTime\"></div>` inside `ttInner` HTML\n - Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions\n - Update speed select `onchange` to call `ttSetSpeed(+this.value)`\n - Add 64× option to speed select\n - Update `_ttMovePlayhead` to also update `ttPlayheadTime` label\n - Update `ttSyncBtn` to start/stop timer based on play state + speed\n - Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)\n - Rebuild Docker image after changes\n\n8. Current Work:\n\nWorking on fixing two issues with the Timetable tab:\n1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.\n2. **Timeline position indicator**: Playhead not prominent enough. \n\n**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:\n```css\n.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n```\n\nSession was interrupted by summary request after this CSS edit, mid-implementation.\n\n9. Optional Next Step:\n\nContinuing the fix for: \"still playing speed is not showing properly still just in one second. also I want to see in timeline where I am\"\n\nThe next steps in order are:\n1. Add `<div class=\"tt-playhead-time\" id=\"ttPlayheadTime\"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)\n2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`\n3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)\n4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option\n5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer\n6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`\n\nIf you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl\nContinue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with \"I'll continue\" or similar. Pick up the last task as if the break never happened.","depth":26,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find timetable speed and playhead related code","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"tt-playhead\\|ttPlayhead\\|ttInner\\|_ttMovePlayhead\\|ttSetSpeed\\|_ttStartSpeed\\|_ttStopSpeed\\|ttSyncBtn\\|playbackRate\\|speed.*select\\|spdSel\\|ttSpeed\" /volume1/screenpipe/app/static/index.html | head -80","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n580: <div class=\"tt-inner\" id=\"ttInner\" onclick=\"ttTimelineClick(event)\">\n583: <div class=\"tt-playhead\" id=\"ttPlayhead\"></div>\n598: onpause=\"ttSyncBtn()\"\n599: onplay=\"ttSyncBtn()\">\n607: <select id=\"ttSpeed\" onchange=\"document.getElementById('ttVideo').playbackRate=+this.value\">\n1624: document.getElementById('ttInner').style.width = '100%';\n1632: document.getElementById('ttPlayhead').style.display = 'none';\n1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';\n1700: const inner = document.getElementById('ttInner');\n1710: const inner = document.getElementById('ttInner');\n1718: const inner = document.getElementById('ttInner');\n1750: _ttMovePlayhead(new Date(best.ts).getTime());\n1772: _ttMovePlayhead(new Date(best.ts).getTime());\n1791:function _ttMovePlayhead(tsMs) {\n1792: const ph = document.getElementById('ttPlayhead');\n1802: const ph = document.getElementById('ttPlayhead');\n1805: const inner = document.getElementById('ttInner');\n1819:function ttSyncBtn() {","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 576-625)","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1786-1865)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find chunk loading and playhead update functions","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"ttUpdatePlayhead\\|ttNextChunk\\|ttLoadChunk\\|_ttCurChunk\\|_ttChunks\\|_ttFrames\" /volume1/screenpipe/app/static/index.html | head -50","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"596: onended=\"ttNextChunk()\"\n597: ontimeupdate=\"ttUpdatePlayhead()\"\n1569:let _ttFrames = [];\n1570:let _ttChunks = [];\n1571:let _ttCurChunk = -1;\n1607: _ttFrames = data.frames;\n1609: for (const f of _ttFrames) {\n1613: _ttChunks = [...chunkMap.values()];\n1614: _ttCurChunk = -1;\n1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();\n1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();\n1620: for (const f of _ttFrames) _ttColor(f.app);\n1640: for (const f of _ttFrames) {\n1736: if (!_ttFrames.length) return;\n1737: let best = _ttFrames[0], minDiff = Infinity;\n1738: for (const f of _ttFrames) {\n1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);\n1744: _ttCurChunk = ci;\n1753:function ttNextChunk() {\n1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;\n1755: _ttCurChunk++;\n1757: video.src = _ttChunks[_ttCurChunk][0].video_url;\n1762:function ttUpdatePlayhead() {\n1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;\n1765: const chunk = _ttChunks[_ttCurChunk];","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1754-1793)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1701-1760)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1561-1640)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find time formatting functions","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"function fmtTime\\|function fmtDate\\|function _fmt\\|localTimeToUtc\\|fmtDateTime\" /volume1/screenpipe/app/static/index.html | head -20","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"1088: if (tf) url += `&time_from=${localTimeToUtc(tf)}`;\n1089: if (tt) url += `&time_to=${localTimeToUtc(tt)}`;\n1153: let meta = `<span style=\"color:var(--muted)\">${fmtDateTime(r.timestamp)}</span>${srcBadge}`;\n1166: meta = `<span style=\"color:var(--muted)\">${fmtDateTime(r.timestamp)}</span>${srcBadge} <span class=\"badge ${r.is_input_device?'mic':'sys'}\">${r.is_input_device?'MIC':'SYS'}</span>`;\n1307:function fmtTime(ts) {\n1312:function fmtDateTime(ts) {\n1320:function localTimeToUtc(timeStr) {\n1778:function _fmtSec(s) {\n1788: `${fmtDateTime(f.ts)} · ${f.app}${f.win ? ' / ' + f.win : ''}`;","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1308-1327)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Now I have everything I need. I'll implement the frame-by-frame timer system that replaces","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"video.playbackRate","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"with wall-clock accurate playback, plus add the playhead time label. Let me make the changes:","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Edit","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Added 1 line","depth":24,"role_description":"text"}]...
|
2518400043095791049
|
4474475550963076503
|
click
|
accessibility
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G) - 2 pending changes
2
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: nas]
Explorer Section: screenpipe [SSH: nas]
SCREENPIPE [SSH: NAS]
#recycle
app
data
pipes
.gitignore
app_settings.json
archive.db
db.sqlite
screenpipe_sync.sh
screenpipe.db
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
app_settings.json, Editor Group 1
screenpipe_sync.sh, Editor Group 1
db.sqlite-shm, preview, Editor Group 1
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lets add ability to jump…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: nas
SSH: nas
screenpipe (Git) - master*, Checkout Branch/Tag...
master*
screenpipe (Git) - Synchronize Changes
No Problems
0
0
No Ports Forwarded
0
Notifications
Signed out
Signed out
Shell Script
Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions
LF
UTF-8
Spaces: 2
Ln 320, Col 36
Screen Reader Optimized
git-commit Lukas Kovalik (23 hours ago)
Lukas Kovalik (23 hours ago)
Info: Downloading VS Code Server...
lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time
Session history
New session
Message actions
This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.
Summary:
1. Primary Request and Intent:
The user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:
- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.
- **Q2**: AND combination search (term1 + term2 must both appear) → Added "AND also" input field.
- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.
- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.
- **Q5**: "still the same" (container not picking up config) → Explained `up -d` vs `restart`.
- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.
- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.
- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.
- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.
2. Key Technical Concepts:
- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.
- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.
- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.
- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.
- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.
- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.
- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.
- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.
- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.
- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.
- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\#recycle/`.
3. Files and Code Sections:
- **`/volume1/screenpipe/app/main.py`**
- Added `/api/apps` endpoint (all unique app names from frames table)
- Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)
- `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: "..."}`
- Key snippet:
```python
@app.get("/api/timetable"
)
async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):
...
rows = conn.execute(f"""
SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,
f.offset_index, f.snapshot_path,
vc.file_path AS video_path, vc.fps AS video_fps
FROM frames f
JOIN video_chunks vc ON f.video_chunk_id = vc.id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND f.video_chunk_id IS NOT NULL {dev_clause}
ORDER BY f.timestamp
""", params).fetchall()
# seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)
```
- **`/volume1/screenpipe/app/docker-compose.yml`**
- Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`
- Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`
- screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`
- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)
- **Search enhancements**:
- Added `id="sq2"` "AND also" input between search-row1 and search-row2
- Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id="msOnlyApps"`, `id="msSkipApps"`)
- Updated `buildUrl()` to combine `q + " " + q2` and convert times with `localTimeToUtc()`
- Added `fmtDateTime(ts)` showing "Apr 20 14:08" format
- Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC
- Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`
- **Timetable tab** (new page):
- Tab button added between Work Report and AI Summary
- `showPage` array updated: `['activity','search','audio','report','timetable','summary']`
- `refresh()` calls `loadTimetable()` when on timetable page
- **Timetable CSS** (key styles):
```css
.tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }
.tt-inner { position:relative; height:52px; } /* width set dynamically */
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
.tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }
.tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }
```
- **Timetable JS state variables**:
```javascript
let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;
let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;
const _ttAppColors = {};
const TT_ZOOMS = [1, 2, 4, 8, 16, 32];
const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};
```
- **Key JS functions**:
- `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders
- `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead
- `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)
- `ttOverviewClick(e)` — scrolls timeline + seeks video
- `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`
- `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`
- `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video
- `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked
- `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`
- `_ttShowNow(f)` — updates screenshot thumbnail + now-text div
- `ttSyncBtn()` — syncs play/pause button text
- Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom
- **`/volume1/screenpipe/.gitignore`**
```
*.db, *.sqlite, *.sqlite-shm, *.sqlite-wal
data/, \#recycle/,
@eaDir/
app_settings.json, app/.env
__pycache__/, *.pyc, .DS_Store
```
4. Errors and Fixes:
- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\#recycle/`. Also had to `git rm --cached "#recycle/desktop.ini"` to unstage it.
- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.
- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.
- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.
- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.
5. Problem Solving:
- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.
- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.
- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).
- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.
6. All User Messages:
- "do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps."
- "doi I need to restart?"
- "there is sudo docker compose"
- "no still the same"
- "add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git"
- "just do it" (re: git push)
- "how to make sure data in :8767 are accurate and point to archive.db"
- "I can't see older than 16th there should 21st of april. In http://[IP_ADDRESS]:8766/ I can see all but not on sqlite viewer http://[IP_ADDRESS]:8767"
- "ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive"
- [docker compose output showing orphan container error]
- "looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast"
- "lets make the playing speed more than 8x"
- "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
7. Pending Tasks:
- **Playback speed fix** (in progress, partially done):
- Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` inside `ttInner` HTML
- Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions
- Update speed select `onchange` to call `ttSetSpeed(+this.value)`
- Add 64× option to speed select
- Update `_ttMovePlayhead` to also update `ttPlayheadTime` label
- Update `ttSyncBtn` to start/stop timer based on play state + speed
- Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)
- Rebuild Docker image after changes
8. Current Work:
Working on fixing two issues with the Timetable tab:
1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.
2. **Timeline position indicator**: Playhead not prominent enough.
**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:
```css
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
```
Session was interrupted by summary request after this CSS edit, mid-implementation.
9. Optional Next Step:
Continuing the fix for: "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
The next steps in order are:
1. Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)
2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`
3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)
4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option
5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer
6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`
If you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl
Continue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with "I'll continue" or similar. Pick up the last task as if the break never happened.
Thinking
Thinking
Bash
Find timetable speed and playhead related code
IN
grep -n "tt-playhead\|ttPlayhead\|ttInner\|_ttMovePlayhead\|ttSetSpeed\|_ttStartSpeed\|_ttStopSpeed\|ttSyncBtn\|playbackRate\|speed.*select\|spdSel\|ttSpeed" /volume1/screenpipe/app/static/index.html | head -80
Copy code to clipboard
OUT
207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
580: <div class="tt-inner" id="ttInner" onclick="ttTimelineClick(event)">
583: <div class="tt-playhead" id="ttPlayhead"></div>
598: onpause="ttSyncBtn()"
599: onplay="ttSyncBtn()">
607: <select id="ttSpeed" onchange="document.getElementById('ttVideo').playbackRate=+this.value">
1624: document.getElementById('ttInner').style.width = '100%';
1632: document.getElementById('ttPlayhead').style.display = 'none';
1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';
1700: const inner = document.getElementById('ttInner');
1710: const inner = document.getElementById('ttInner');
1718: const inner = document.getElementById('ttInner');
1750: _ttMovePlayhead(new Date(best.ts).getTime());
1772: _ttMovePlayhead(new Date(best.ts).getTime());
1791:function _ttMovePlayhead(tsMs) {
1792: const ph = document.getElementById('ttPlayhead');
1802: const ph = document.getElementById('ttPlayhead');
1805: const inner = document.getElementById('ttInner');
1819:function ttSyncBtn() {
Read
index.html
index.html
(lines 576-625)
Read
index.html
index.html
(lines 1786-1865)
Thinking
Thinking
Bash
Find chunk loading and playhead update functions
IN
grep -n "ttUpdatePlayhead\|ttNextChunk\|ttLoadChunk\|_ttCurChunk\|_ttChunks\|_ttFrames" /volume1/screenpipe/app/static/index.html | head -50
Copy code to clipboard
OUT
596: onended="ttNextChunk()"
597: ontimeupdate="ttUpdatePlayhead()"
1569:let _ttFrames = [];
1570:let _ttChunks = [];
1571:let _ttCurChunk = -1;
1607: _ttFrames = data.frames;
1609: for (const f of _ttFrames) {
1613: _ttChunks = [...chunkMap.values()];
1614: _ttCurChunk = -1;
1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();
1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();
1620: for (const f of _ttFrames) _ttColor(f.app);
1640: for (const f of _ttFrames) {
1736: if (!_ttFrames.length) return;
1737: let best = _ttFrames[0], minDiff = Infinity;
1738: for (const f of _ttFrames) {
1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);
1744: _ttCurChunk = ci;
1753:function ttNextChunk() {
1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;
1755: _ttCurChunk++;
1757: video.src = _ttChunks[_ttCurChunk][0].video_url;
1762:function ttUpdatePlayhead() {
1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;
1765: const chunk = _ttChunks[_ttCurChunk];
Read
index.html
index.html
(lines 1754-1793)
Thinking
Thinking
Read
index.html
index.html
(lines 1701-1760)
Thinking
Thinking
Read
index.html
index.html
(lines 1561-1640)
Thinking
Thinking
Bash
Find time formatting functions
IN
grep -n "function fmtTime\|function fmtDate\|function _fmt\|localTimeToUtc\|fmtDateTime" /volume1/screenpipe/app/static/index.html | head -20
Copy code to clipboard
OUT
1088: if (tf) url += `&time_from=${localTimeToUtc(tf)}`;
1089: if (tt) url += `&time_to=${localTimeToUtc(tt)}`;
1153: let meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge}`;
1166: meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge} <span class="badge ${r.is_input_device?'mic':'sys'}">${r.is_input_device?'MIC':'SYS'}</span>`;
1307:function fmtTime(ts) {
1312:function fmtDateTime(ts) {
1320:function localTimeToUtc(timeStr) {
1778:function _fmtSec(s) {
1788: `${fmtDateTime(f.ts)} · ${f.app}${f.win ? ' / ' + f.win : ''}`;
Read
index.html
index.html
(lines 1308-1327)
Thinking
Thinking
Now I have everything I need. I'll implement the frame-by-frame timer system that replaces
video.playbackRate
with wall-clock accurate playback, plus add the playhead time label. Let me make the changes:
Edit
index.html
index.html
Added 1 line...
|
NULL
|
NULL
|
|
81027
|
2156
|
9
|
2026-04-25T15:56:27.771347+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-25/1777 /Users/lukas/.screenpipe/data/data/2026-04-25/1777132587771_m1.jpg...
|
Code
|
screenpipe_sync.sh — screenpipe [SSH: nas]
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G) - 2 pending changes
2
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: nas]
Explorer Section: screenpipe [SSH: nas]
SCREENPIPE [SSH: NAS]
#recycle
app
data
pipes
.gitignore
app_settings.json
archive.db
db.sqlite
screenpipe_sync.sh
screenpipe.db
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
app_settings.json, Editor Group 1
screenpipe_sync.sh, Editor Group 1
db.sqlite-shm, preview, Editor Group 1
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lets add ability to jump…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: nas
SSH: nas
screenpipe (Git) - master*, Checkout Branch/Tag...
master*
screenpipe (Git) - Synchronize Changes
No Problems
0
0
No Ports Forwarded
0
Notifications
Signed out
Signed out
Shell Script
Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions
LF
UTF-8
Spaces: 2
Ln 18, Col 36
Screen Reader Optimized
git-commit Lukas Kovalik (23 hours ago)
Lukas Kovalik (23 hours ago)
Info: Downloading VS Code Server...
lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time
Session history
New session
Message actions
This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.
Summary:
1. Primary Request and Intent:
The user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:
- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.
- **Q2**: AND combination search (term1 + term2 must both appear) → Added "AND also" input field.
- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.
- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.
- **Q5**: "still the same" (container not picking up config) → Explained `up -d` vs `restart`.
- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.
- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.
- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.
- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.
2. Key Technical Concepts:
- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.
- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.
- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.
- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.
- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.
- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.
- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.
- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.
- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.
- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.
- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\#recycle/`.
3. Files and Code Sections:
- **`/volume1/screenpipe/app/main.py`**
- Added `/api/apps` endpoint (all unique app names from frames table)
- Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)
- `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: "..."}`
- Key snippet:
```python
@app.get("/api/timetable"
)
async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):
...
rows = conn.execute(f"""
SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,
f.offset_index, f.snapshot_path,
vc.file_path AS video_path, vc.fps AS video_fps
FROM frames f
JOIN video_chunks vc ON f.video_chunk_id = vc.id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND f.video_chunk_id IS NOT NULL {dev_clause}
ORDER BY f.timestamp
""", params).fetchall()
# seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)
```
- **`/volume1/screenpipe/app/docker-compose.yml`**
- Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`
- Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`
- screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`
- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)
- **Search enhancements**:
- Added `id="sq2"` "AND also" input between search-row1 and search-row2
- Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id="msOnlyApps"`, `id="msSkipApps"`)
- Updated `buildUrl()` to combine `q + " " + q2` and convert times with `localTimeToUtc()`
- Added `fmtDateTime(ts)` showing "Apr 20 14:08" format
- Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC
- Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`
- **Timetable tab** (new page):
- Tab button added between Work Report and AI Summary
- `showPage` array updated: `['activity','search','audio','report','timetable','summary']`
- `refresh()` calls `loadTimetable()` when on timetable page
- **Timetable CSS** (key styles):
```css
.tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }
.tt-inner { position:relative; height:52px; } /* width set dynamically */
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
.tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }
.tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }
```
- **Timetable JS state variables**:
```javascript
let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;
let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;
const _ttAppColors = {};
const TT_ZOOMS = [1, 2, 4, 8, 16, 32];
const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};
```
- **Key JS functions**:
- `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders
- `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead
- `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)
- `ttOverviewClick(e)` — scrolls timeline + seeks video
- `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`
- `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`
- `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video
- `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked
- `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`
- `_ttShowNow(f)` — updates screenshot thumbnail + now-text div
- `ttSyncBtn()` — syncs play/pause button text
- Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom
- **`/volume1/screenpipe/.gitignore`**
```
*.db, *.sqlite, *.sqlite-shm, *.sqlite-wal
data/, \#recycle/,
@eaDir/
app_settings.json, app/.env
__pycache__/, *.pyc, .DS_Store
```
4. Errors and Fixes:
- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\#recycle/`. Also had to `git rm --cached "#recycle/desktop.ini"` to unstage it.
- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.
- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.
- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.
- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.
5. Problem Solving:
- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.
- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.
- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).
- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.
6. All User Messages:
- "do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps."
- "doi I need to restart?"
- "there is sudo docker compose"
- "no still the same"
- "add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git"
- "just do it" (re: git push)
- "how to make sure data in :8767 are accurate and point to archive.db"
- "I can't see older than 16th there should 21st of april. In http://[IP_ADDRESS]:8766/ I can see all but not on sqlite viewer http://[IP_ADDRESS]:8767"
- "ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive"
- [docker compose output showing orphan container error]
- "looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast"
- "lets make the playing speed more than 8x"
- "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
7. Pending Tasks:
- **Playback speed fix** (in progress, partially done):
- Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` inside `ttInner` HTML
- Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions
- Update speed select `onchange` to call `ttSetSpeed(+this.value)`
- Add 64× option to speed select
- Update `_ttMovePlayhead` to also update `ttPlayheadTime` label
- Update `ttSyncBtn` to start/stop timer based on play state + speed
- Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)
- Rebuild Docker image after changes
8. Current Work:
Working on fixing two issues with the Timetable tab:
1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.
2. **Timeline position indicator**: Playhead not prominent enough.
**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:
```css
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
```
Session was interrupted by summary request after this CSS edit, mid-implementation.
9. Optional Next Step:
Continuing the fix for: "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
The next steps in order are:
1. Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)
2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`
3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)
4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option
5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer
6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`
If you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl
Continue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with "I'll continue" or similar. Pick up the last task as if the break never happened.
Thinking
Thinking
Bash
Find timetable speed and playhead related code
IN
grep -n "tt-playhead\|ttPlayhead\|ttInner\|_ttMovePlayhead\|ttSetSpeed\|_ttStartSpeed\|_ttStopSpeed\|ttSyncBtn\|playbackRate\|speed.*select\|spdSel\|ttSpeed" /volume1/screenpipe/app/static/index.html | head -80
Copy code to clipboard
OUT
207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
580: <div class="tt-inner" id="ttInner" onclick="ttTimelineClick(event)">
583: <div class="tt-playhead" id="ttPlayhead"></div>
598: onpause="ttSyncBtn()"
599: onplay="ttSyncBtn()">
607: <select id="ttSpeed" onchange="document.getElementById('ttVideo').playbackRate=+this.value">
1624: document.getElementById('ttInner').style.width = '100%';
1632: document.getElementById('ttPlayhead').style.display = 'none';
1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';
1700: const inner = document.getElementById('ttInner');
1710: const inner = document.getElementById('ttInner');
1718: const inner = document.getElementById('ttInner');
1750: _ttMovePlayhead(new Date(best.ts).getTime());
1772: _ttMovePlayhead(new Date(best.ts).getTime());
1791:function _ttMovePlayhead(tsMs) {
1792: const ph = document.getElementById('ttPlayhead');
1802: const ph = document.getElementById('ttPlayhead');
1805: const inner = document.getElementById('ttInner');
1819:function ttSyncBtn() {
Read
index.html
index.html
(lines 576-625)
Read
index.html
index.html
(lines 1786-1865)
Thinking
Thinking
Bash
Find chunk loading and playhead update functions
IN
grep -n "ttUpdatePlayhead\|ttNextChunk\|ttLoadChunk\|_ttCurChunk\|_ttChunks\|_ttFrames" /volume1/screenpipe/app/static/index.html | head -50
Copy code to clipboard
OUT
596: onended="ttNextChunk()"
597: ontimeupdate="ttUpdatePlayhead()"
1569:let _ttFrames = [];
1570:let _ttChunks = [];
1571:let _ttCurChunk = -1;
1607: _ttFrames = data.frames;
1609: for (const f of _ttFrames) {
1613: _ttChunks = [...chunkMap.values()];
1614: _ttCurChunk = -1;
1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();
1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();
1620: for (const f of _ttFrames) _ttColor(f.app);
1640: for (const f of _ttFrames) {
1736: if (!_ttFrames.length) return;
1737: let best = _ttFrames[0], minDiff = Infinity;
1738: for (const f of _ttFrames) {
1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);
1744: _ttCurChunk = ci;
1753:function ttNextChunk() {
1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;
1755: _ttCurChunk++;
1757: video.src = _ttChunks[_ttCurChunk][0].video_url;
1762:function ttUpdatePlayhead() {
1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;
1765: const chunk = _ttChunks[_ttCurChunk];
Read
index.html
index.html
(lines 1754-1793)
Thinking
Thinking
Read
index.html
index.html
(lines 1701-1760)
Thinking
Thinking
Read
index.html
index.html
(lines 1561-1640)
Thinking
Thinking
Bash
Find time formatting functions
IN
grep -n "function fmtTime\|function fmtDate\|function _fmt\|localTimeToUtc\|fmtDateTime" /volume1/screenpipe/app/static/index.html | head -20
Copy code to clipboard...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Explorer (⇧⌘E)","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"","depth":22,"role_description":"text"},{"role":"AXRadioButton","text":"Search (⇧⌘F)","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"role_description":"text"},{"role":"AXRadioButton","text":"Source Control (⌃⇧G) - 2 pending changes","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":22,"role_description":"text"},{"role":"AXRadioButton","text":"Run and Debug (⇧⌘D)","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"role_description":"text"},{"role":"AXRadioButton","text":"Remote Explorer","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"role_description":"text"},{"role":"AXRadioButton","text":"Extensions (⇧⌘X) - 2 require update, 1 requires restart","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":22,"role_description":"text"},{"role":"AXRadioButton","text":"Claude Code","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"Containers","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"EXPLORER","depth":17,"role_description":"heading"},{"role":"AXStaticText","text":"EXPLORER","depth":18,"role_description":"text"},{"role":"AXButton","text":"Explorer Section: screenpipe [SSH: nas]","depth":21,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXHeading","text":"Explorer Section: screenpipe [SSH: nas]","depth":22,"role_description":"heading"},{"role":"AXStaticText","text":"SCREENPIPE [SSH: NAS]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"#recycle","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"app","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"data","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"pipes","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":".gitignore","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"app_settings.json","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"archive.db","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"db.sqlite","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"screenpipe_sync.sh","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"screenpipe.db","depth":27,"role_description":"text"},{"role":"AXButton","text":"Outline Section","depth":21,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXHeading","text":"OUTLINE","depth":22,"role_description":"heading"},{"role":"AXStaticText","text":"OUTLINE","depth":23,"role_description":"text"},{"role":"AXButton","text":"Timeline Section","depth":21,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXHeading","text":"TIMELINE","depth":22,"role_description":"heading"},{"role":"AXStaticText","text":"TIMELINE","depth":23,"role_description":"text"},{"role":"AXRadioButton","text":"app_settings.json, Editor Group 1","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe_sync.sh, Editor Group 1","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":"db.sqlite-shm, preview, Editor Group 1","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/Test/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","depth":28,"value":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/Test/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","role_description":"editor","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/Test/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","depth":29,"role_description":"text"},{"role":"AXRadioButton","text":"lets add ability to jump…, Editor Group 2","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":"Problems (⇧⌘M)","depth":22,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PROBLEMS","depth":24,"role_description":"text"},{"role":"AXRadioButton","text":"Output (⇧⌘U)","depth":22,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUTPUT","depth":24,"role_description":"text"},{"role":"AXRadioButton","text":"Debug Console (⇧⌘Y)","depth":22,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"DEBUG CONSOLE","depth":24,"role_description":"text"},{"role":"AXRadioButton","text":"Terminal (⌃`)","depth":22,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"TERMINAL","depth":24,"role_description":"text"},{"role":"AXRadioButton","text":"Ports","depth":22,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PORTS","depth":24,"role_description":"text"},{"role":"AXButton","text":"remote SSH: nas","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"SSH: nas","depth":17,"role_description":"text"},{"role":"AXButton","text":"screenpipe (Git) - master*, Checkout Branch/Tag...","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"master*","depth":17,"role_description":"text"},{"role":"AXButton","text":"screenpipe (Git) - Synchronize Changes","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"No Problems","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"role_description":"text"},{"role":"AXButton","text":"No Ports Forwarded","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"role_description":"text"},{"role":"AXButton","text":"Notifications","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Signed out","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"Signed out","depth":17,"role_description":"text"},{"role":"AXButton","text":"Shell Script","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"LF","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"UTF-8","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Spaces: 2","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Ln 18, Col 36","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Screen Reader Optimized","depth":16,"bounds":{"left":1.0,"top":0.0,"width":-0.079861164,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"git-commit Lukas Kovalik (23 hours ago)","depth":16,"bounds":{"left":0.9444444,"top":0.0,"width":0.055555582,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.9479167,"top":0.0,"width":0.011111111,"height":0.017777778},"role_description":"text"},{"role":"AXStaticText","text":"Lukas Kovalik (23 hours ago)","depth":17,"bounds":{"left":0.95902777,"top":0.0,"width":0.040972233,"height":0.015555556},"role_description":"text"},{"role":"AXStaticText","text":"Info: Downloading VS Code Server...","depth":12,"role_description":"text"},{"role":"AXButton","text":"lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time","depth":19,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Session history","depth":19,"help_text":"Session history","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New session","depth":19,"help_text":"New session","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Message actions","depth":24,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.\n\nSummary:\n1. Primary Request and Intent:\n\nThe user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:\n- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.\n- **Q2**: AND combination search (term1 + term2 must both appear) → Added \"AND also\" input field.\n- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.\n- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.\n- **Q5**: \"still the same\" (container not picking up config) → Explained `up -d` vs `restart`.\n- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.\n- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.\n- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.\n- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.\n\n2. Key Technical Concepts:\n\n- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.\n- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.\n- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.\n- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.\n- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.\n- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.\n- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.\n- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.\n- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.\n- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.\n- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\\#recycle/`.\n\n3. Files and Code Sections:\n\n- **`/volume1/screenpipe/app/main.py`**\n - Added `/api/apps` endpoint (all unique app names from frames table)\n - Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)\n - `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: \"...\"}`\n - Key snippet:\n ```python","depth":26,"role_description":"text"},{"role":"AXButton","text":"@app.get(\"/api/timetable\"","depth":26,"help_text":"Open app.get(\"/api/timetable\"","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":")\n async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):\n ...\n rows = conn.execute(f\"\"\"\n SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,\n f.offset_index, f.snapshot_path,\n vc.file_path AS video_path, vc.fps AS video_fps\n FROM frames f\n JOIN video_chunks vc ON f.video_chunk_id = vc.id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND f.video_chunk_id IS NOT NULL {dev_clause}\n ORDER BY f.timestamp\n \"\"\", params).fetchall()\n # seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)\n ```\n\n- **`/volume1/screenpipe/app/docker-compose.yml`**\n - Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`\n - Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`\n - screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`\n\n- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)\n - **Search enhancements**:\n - Added `id=\"sq2\"` \"AND also\" input between search-row1 and search-row2\n - Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id=\"msOnlyApps\"`, `id=\"msSkipApps\"`)\n - Updated `buildUrl()` to combine `q + \" \" + q2` and convert times with `localTimeToUtc()`\n - Added `fmtDateTime(ts)` showing \"Apr 20 14:08\" format\n - Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC\n - Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`\n - **Timetable tab** (new page):\n - Tab button added between Work Report and AI Summary\n - `showPage` array updated: `['activity','search','audio','report','timetable','summary']`\n - `refresh()` calls `loadTimetable()` when on timetable page\n - **Timetable CSS** (key styles):\n ```css\n .tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }\n .tt-inner { position:relative; height:52px; } /* width set dynamically */\n .tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n .tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n .tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }\n .tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }\n ```\n - **Timetable JS state variables**:\n ```javascript\n let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;\n let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;\n const _ttAppColors = {};\n const TT_ZOOMS = [1, 2, 4, 8, 16, 32];\n const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};\n ```\n - **Key JS functions**:\n - `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders\n - `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead\n - `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)\n - `ttOverviewClick(e)` — scrolls timeline + seeks video\n - `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`\n - `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`\n - `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video\n - `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked\n - `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`\n - `_ttShowNow(f)` — updates screenshot thumbnail + now-text div\n - `ttSyncBtn()` — syncs play/pause button text\n - Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom\n\n- **`/volume1/screenpipe/.gitignore`**\n ```\n *.db, *.sqlite, *.sqlite-shm, *.sqlite-wal\n data/, \\#recycle/,","depth":26,"role_description":"text"},{"role":"AXButton","text":"@eaDir/","depth":26,"help_text":"Open eaDir/","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"app_settings.json, app/.env\n __pycache__/, *.pyc, .DS_Store\n ```\n\n4. Errors and Fixes:\n\n- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\\#recycle/`. Also had to `git rm --cached \"#recycle/desktop.ini\"` to unstage it.\n- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.\n- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.\n- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.\n- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.\n\n5. Problem Solving:\n\n- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.\n- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.\n- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).\n- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.\n\n6. All User Messages:\n\n- \"do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps.\"\n- \"doi I need to restart?\"\n- \"there is sudo docker compose\"\n- \"no still the same\"\n- \"add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git\"\n- \"just do it\" (re: git push)\n- \"how to make sure data in :8767 are accurate and point to archive.db\"\n- \"I can't see older than 16th there should 21st of april. In http://192.168.0.242:8766/ I can see all but not on sqlite viewer http://192.168.0.242:8767\"\n- \"ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive\"\n- [docker compose output showing orphan container error]\n- \"looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast\"\n- \"lets make the playing speed more than 8x\"\n- \"still playing speed is not showing properly still just in one second. also I want to see in timeline where I am\"\n\n7. Pending Tasks:\n\n- **Playback speed fix** (in progress, partially done):\n - Add `<div class=\"tt-playhead-time\" id=\"ttPlayheadTime\"></div>` inside `ttInner` HTML\n - Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions\n - Update speed select `onchange` to call `ttSetSpeed(+this.value)`\n - Add 64× option to speed select\n - Update `_ttMovePlayhead` to also update `ttPlayheadTime` label\n - Update `ttSyncBtn` to start/stop timer based on play state + speed\n - Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)\n - Rebuild Docker image after changes\n\n8. Current Work:\n\nWorking on fixing two issues with the Timetable tab:\n1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.\n2. **Timeline position indicator**: Playhead not prominent enough. \n\n**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:\n```css\n.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n```\n\nSession was interrupted by summary request after this CSS edit, mid-implementation.\n\n9. Optional Next Step:\n\nContinuing the fix for: \"still playing speed is not showing properly still just in one second. also I want to see in timeline where I am\"\n\nThe next steps in order are:\n1. Add `<div class=\"tt-playhead-time\" id=\"ttPlayheadTime\"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)\n2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`\n3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)\n4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option\n5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer\n6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`\n\nIf you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl\nContinue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with \"I'll continue\" or similar. Pick up the last task as if the break never happened.","depth":26,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find timetable speed and playhead related code","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"tt-playhead\\|ttPlayhead\\|ttInner\\|_ttMovePlayhead\\|ttSetSpeed\\|_ttStartSpeed\\|_ttStopSpeed\\|ttSyncBtn\\|playbackRate\\|speed.*select\\|spdSel\\|ttSpeed\" /volume1/screenpipe/app/static/index.html | head -80","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n580: <div class=\"tt-inner\" id=\"ttInner\" onclick=\"ttTimelineClick(event)\">\n583: <div class=\"tt-playhead\" id=\"ttPlayhead\"></div>\n598: onpause=\"ttSyncBtn()\"\n599: onplay=\"ttSyncBtn()\">\n607: <select id=\"ttSpeed\" onchange=\"document.getElementById('ttVideo').playbackRate=+this.value\">\n1624: document.getElementById('ttInner').style.width = '100%';\n1632: document.getElementById('ttPlayhead').style.display = 'none';\n1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';\n1700: const inner = document.getElementById('ttInner');\n1710: const inner = document.getElementById('ttInner');\n1718: const inner = document.getElementById('ttInner');\n1750: _ttMovePlayhead(new Date(best.ts).getTime());\n1772: _ttMovePlayhead(new Date(best.ts).getTime());\n1791:function _ttMovePlayhead(tsMs) {\n1792: const ph = document.getElementById('ttPlayhead');\n1802: const ph = document.getElementById('ttPlayhead');\n1805: const inner = document.getElementById('ttInner');\n1819:function ttSyncBtn() {","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 576-625)","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1786-1865)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find chunk loading and playhead update functions","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"ttUpdatePlayhead\\|ttNextChunk\\|ttLoadChunk\\|_ttCurChunk\\|_ttChunks\\|_ttFrames\" /volume1/screenpipe/app/static/index.html | head -50","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"596: onended=\"ttNextChunk()\"\n597: ontimeupdate=\"ttUpdatePlayhead()\"\n1569:let _ttFrames = [];\n1570:let _ttChunks = [];\n1571:let _ttCurChunk = -1;\n1607: _ttFrames = data.frames;\n1609: for (const f of _ttFrames) {\n1613: _ttChunks = [...chunkMap.values()];\n1614: _ttCurChunk = -1;\n1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();\n1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();\n1620: for (const f of _ttFrames) _ttColor(f.app);\n1640: for (const f of _ttFrames) {\n1736: if (!_ttFrames.length) return;\n1737: let best = _ttFrames[0], minDiff = Infinity;\n1738: for (const f of _ttFrames) {\n1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);\n1744: _ttCurChunk = ci;\n1753:function ttNextChunk() {\n1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;\n1755: _ttCurChunk++;\n1757: video.src = _ttChunks[_ttCurChunk][0].video_url;\n1762:function ttUpdatePlayhead() {\n1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;\n1765: const chunk = _ttChunks[_ttCurChunk];","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1754-1793)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1701-1760)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1561-1640)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find time formatting functions","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"function fmtTime\\|function fmtDate\\|function _fmt\\|localTimeToUtc\\|fmtDateTime\" /volume1/screenpipe/app/static/index.html | head -20","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
3983049917670881938
|
4474475550963076503
|
click
|
accessibility
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G) - 2 pending changes
2
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: nas]
Explorer Section: screenpipe [SSH: nas]
SCREENPIPE [SSH: NAS]
#recycle
app
data
pipes
.gitignore
app_settings.json
archive.db
db.sqlite
screenpipe_sync.sh
screenpipe.db
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
app_settings.json, Editor Group 1
screenpipe_sync.sh, Editor Group 1
db.sqlite-shm, preview, Editor Group 1
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lets add ability to jump…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: nas
SSH: nas
screenpipe (Git) - master*, Checkout Branch/Tag...
master*
screenpipe (Git) - Synchronize Changes
No Problems
0
0
No Ports Forwarded
0
Notifications
Signed out
Signed out
Shell Script
Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions
LF
UTF-8
Spaces: 2
Ln 18, Col 36
Screen Reader Optimized
git-commit Lukas Kovalik (23 hours ago)
Lukas Kovalik (23 hours ago)
Info: Downloading VS Code Server...
lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time
Session history
New session
Message actions
This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.
Summary:
1. Primary Request and Intent:
The user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:
- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.
- **Q2**: AND combination search (term1 + term2 must both appear) → Added "AND also" input field.
- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.
- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.
- **Q5**: "still the same" (container not picking up config) → Explained `up -d` vs `restart`.
- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.
- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.
- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.
- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.
2. Key Technical Concepts:
- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.
- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.
- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.
- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.
- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.
- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.
- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.
- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.
- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.
- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.
- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\#recycle/`.
3. Files and Code Sections:
- **`/volume1/screenpipe/app/main.py`**
- Added `/api/apps` endpoint (all unique app names from frames table)
- Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)
- `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: "..."}`
- Key snippet:
```python
@app.get("/api/timetable"
)
async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):
...
rows = conn.execute(f"""
SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,
f.offset_index, f.snapshot_path,
vc.file_path AS video_path, vc.fps AS video_fps
FROM frames f
JOIN video_chunks vc ON f.video_chunk_id = vc.id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND f.video_chunk_id IS NOT NULL {dev_clause}
ORDER BY f.timestamp
""", params).fetchall()
# seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)
```
- **`/volume1/screenpipe/app/docker-compose.yml`**
- Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`
- Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`
- screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`
- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)
- **Search enhancements**:
- Added `id="sq2"` "AND also" input between search-row1 and search-row2
- Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id="msOnlyApps"`, `id="msSkipApps"`)
- Updated `buildUrl()` to combine `q + " " + q2` and convert times with `localTimeToUtc()`
- Added `fmtDateTime(ts)` showing "Apr 20 14:08" format
- Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC
- Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`
- **Timetable tab** (new page):
- Tab button added between Work Report and AI Summary
- `showPage` array updated: `['activity','search','audio','report','timetable','summary']`
- `refresh()` calls `loadTimetable()` when on timetable page
- **Timetable CSS** (key styles):
```css
.tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }
.tt-inner { position:relative; height:52px; } /* width set dynamically */
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
.tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }
.tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }
```
- **Timetable JS state variables**:
```javascript
let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;
let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;
const _ttAppColors = {};
const TT_ZOOMS = [1, 2, 4, 8, 16, 32];
const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};
```
- **Key JS functions**:
- `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders
- `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead
- `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)
- `ttOverviewClick(e)` — scrolls timeline + seeks video
- `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`
- `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`
- `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video
- `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked
- `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`
- `_ttShowNow(f)` — updates screenshot thumbnail + now-text div
- `ttSyncBtn()` — syncs play/pause button text
- Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom
- **`/volume1/screenpipe/.gitignore`**
```
*.db, *.sqlite, *.sqlite-shm, *.sqlite-wal
data/, \#recycle/,
@eaDir/
app_settings.json, app/.env
__pycache__/, *.pyc, .DS_Store
```
4. Errors and Fixes:
- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\#recycle/`. Also had to `git rm --cached "#recycle/desktop.ini"` to unstage it.
- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.
- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.
- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.
- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.
5. Problem Solving:
- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.
- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.
- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).
- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.
6. All User Messages:
- "do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps."
- "doi I need to restart?"
- "there is sudo docker compose"
- "no still the same"
- "add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git"
- "just do it" (re: git push)
- "how to make sure data in :8767 are accurate and point to archive.db"
- "I can't see older than 16th there should 21st of april. In http://[IP_ADDRESS]:8766/ I can see all but not on sqlite viewer http://[IP_ADDRESS]:8767"
- "ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive"
- [docker compose output showing orphan container error]
- "looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast"
- "lets make the playing speed more than 8x"
- "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
7. Pending Tasks:
- **Playback speed fix** (in progress, partially done):
- Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` inside `ttInner` HTML
- Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions
- Update speed select `onchange` to call `ttSetSpeed(+this.value)`
- Add 64× option to speed select
- Update `_ttMovePlayhead` to also update `ttPlayheadTime` label
- Update `ttSyncBtn` to start/stop timer based on play state + speed
- Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)
- Rebuild Docker image after changes
8. Current Work:
Working on fixing two issues with the Timetable tab:
1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.
2. **Timeline position indicator**: Playhead not prominent enough.
**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:
```css
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
```
Session was interrupted by summary request after this CSS edit, mid-implementation.
9. Optional Next Step:
Continuing the fix for: "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
The next steps in order are:
1. Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)
2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`
3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)
4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option
5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer
6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`
If you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl
Continue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with "I'll continue" or similar. Pick up the last task as if the break never happened.
Thinking
Thinking
Bash
Find timetable speed and playhead related code
IN
grep -n "tt-playhead\|ttPlayhead\|ttInner\|_ttMovePlayhead\|ttSetSpeed\|_ttStartSpeed\|_ttStopSpeed\|ttSyncBtn\|playbackRate\|speed.*select\|spdSel\|ttSpeed" /volume1/screenpipe/app/static/index.html | head -80
Copy code to clipboard
OUT
207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
580: <div class="tt-inner" id="ttInner" onclick="ttTimelineClick(event)">
583: <div class="tt-playhead" id="ttPlayhead"></div>
598: onpause="ttSyncBtn()"
599: onplay="ttSyncBtn()">
607: <select id="ttSpeed" onchange="document.getElementById('ttVideo').playbackRate=+this.value">
1624: document.getElementById('ttInner').style.width = '100%';
1632: document.getElementById('ttPlayhead').style.display = 'none';
1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';
1700: const inner = document.getElementById('ttInner');
1710: const inner = document.getElementById('ttInner');
1718: const inner = document.getElementById('ttInner');
1750: _ttMovePlayhead(new Date(best.ts).getTime());
1772: _ttMovePlayhead(new Date(best.ts).getTime());
1791:function _ttMovePlayhead(tsMs) {
1792: const ph = document.getElementById('ttPlayhead');
1802: const ph = document.getElementById('ttPlayhead');
1805: const inner = document.getElementById('ttInner');
1819:function ttSyncBtn() {
Read
index.html
index.html
(lines 576-625)
Read
index.html
index.html
(lines 1786-1865)
Thinking
Thinking
Bash
Find chunk loading and playhead update functions
IN
grep -n "ttUpdatePlayhead\|ttNextChunk\|ttLoadChunk\|_ttCurChunk\|_ttChunks\|_ttFrames" /volume1/screenpipe/app/static/index.html | head -50
Copy code to clipboard
OUT
596: onended="ttNextChunk()"
597: ontimeupdate="ttUpdatePlayhead()"
1569:let _ttFrames = [];
1570:let _ttChunks = [];
1571:let _ttCurChunk = -1;
1607: _ttFrames = data.frames;
1609: for (const f of _ttFrames) {
1613: _ttChunks = [...chunkMap.values()];
1614: _ttCurChunk = -1;
1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();
1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();
1620: for (const f of _ttFrames) _ttColor(f.app);
1640: for (const f of _ttFrames) {
1736: if (!_ttFrames.length) return;
1737: let best = _ttFrames[0], minDiff = Infinity;
1738: for (const f of _ttFrames) {
1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);
1744: _ttCurChunk = ci;
1753:function ttNextChunk() {
1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;
1755: _ttCurChunk++;
1757: video.src = _ttChunks[_ttCurChunk][0].video_url;
1762:function ttUpdatePlayhead() {
1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;
1765: const chunk = _ttChunks[_ttCurChunk];
Read
index.html
index.html
(lines 1754-1793)
Thinking
Thinking
Read
index.html
index.html
(lines 1701-1760)
Thinking
Thinking
Read
index.html
index.html
(lines 1561-1640)
Thinking
Thinking
Bash
Find time formatting functions
IN
grep -n "function fmtTime\|function fmtDate\|function _fmt\|localTimeToUtc\|fmtDateTime" /volume1/screenpipe/app/static/index.html | head -20
Copy code to clipboard...
|
NULL
|
NULL
|
|
81028
|
2157
|
13
|
2026-04-25T15:56:27.870539+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-25/1777 /Users/lukas/.screenpipe/data/data/2026-04-25/1777132587870_m2.jpg...
|
Code
|
screenpipe_sync.sh — screenpipe [SSH: nas]
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G) - 2 pending changes
2
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: nas]
Explorer Section: screenpipe [SSH: nas]
SCREENPIPE [SSH: NAS]
#recycle
app
data
pipes
.gitignore
app_settings.json
archive.db
db.sqlite
screenpipe_sync.sh
screenpipe.db
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
app_settings.json, Editor Group 1
screenpipe_sync.sh, Editor Group 1
db.sqlite-shm, preview, Editor Group 1
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lets add ability to jump…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: nas
SSH: nas
screenpipe (Git) - master*, Checkout Branch/Tag...
master*
screenpipe (Git) - Synchronize Changes
No Problems
0
0
No Ports Forwarded
0
Notifications
Signed out
Signed out
Shell Script
Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions
LF
UTF-8
Spaces: 2
Ln 18, Col 36
Screen Reader Optimized
git-commit Lukas Kovalik (23 hours ago)
Lukas Kovalik (23 hours ago)
Info: Downloading VS Code Server...
lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time
Session history
New session
Message actions
This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.
Summary:
1. Primary Request and Intent:
The user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:
- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.
- **Q2**: AND combination search (term1 + term2 must both appear) → Added "AND also" input field.
- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.
- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.
- **Q5**: "still the same" (container not picking up config) → Explained `up -d` vs `restart`.
- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.
- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.
- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.
- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.
2. Key Technical Concepts:
- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.
- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.
- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.
- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.
- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.
- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.
- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.
- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.
- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.
- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.
- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\#recycle/`.
3. Files and Code Sections:
- **`/volume1/screenpipe/app/main.py`**
- Added `/api/apps` endpoint (all unique app names from frames table)
- Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)
- `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: "..."}`
- Key snippet:
```python
@app.get("/api/timetable"
)
async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):
...
rows = conn.execute(f"""
SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,
f.offset_index, f.snapshot_path,
vc.file_path AS video_path, vc.fps AS video_fps
FROM frames f
JOIN video_chunks vc ON f.video_chunk_id = vc.id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND f.video_chunk_id IS NOT NULL {dev_clause}
ORDER BY f.timestamp
""", params).fetchall()
# seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)
```
- **`/volume1/screenpipe/app/docker-compose.yml`**
- Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`
- Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`
- screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`
- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)
- **Search enhancements**:
- Added `id="sq2"` "AND also" input between search-row1 and search-row2
- Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id="msOnlyApps"`, `id="msSkipApps"`)
- Updated `buildUrl()` to combine `q + " " + q2` and convert times with `localTimeToUtc()`
- Added `fmtDateTime(ts)` showing "Apr 20 14:08" format
- Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC
- Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`
- **Timetable tab** (new page):
- Tab button added between Work Report and AI Summary
- `showPage` array updated: `['activity','search','audio','report','timetable','summary']`
- `refresh()` calls `loadTimetable()` when on timetable page
- **Timetable CSS** (key styles):
```css
.tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }
.tt-inner { position:relative; height:52px; } /* width set dynamically */
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
.tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }
.tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }
```
- **Timetable JS state variables**:
```javascript
let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;
let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;
const _ttAppColors = {};
const TT_ZOOMS = [1, 2, 4, 8, 16, 32];
const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};
```
- **Key JS functions**:
- `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders
- `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead
- `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)
- `ttOverviewClick(e)` — scrolls timeline + seeks video
- `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`
- `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`
- `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video
- `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked
- `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`
- `_ttShowNow(f)` — updates screenshot thumbnail + now-text div
- `ttSyncBtn()` — syncs play/pause button text
- Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom
- **`/volume1/screenpipe/.gitignore`**
```
*.db, *.sqlite, *.sqlite-shm, *.sqlite-wal
data/, \#recycle/,
@eaDir/
app_settings.json, app/.env
__pycache__/, *.pyc, .DS_Store
```
4. Errors and Fixes:
- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\#recycle/`. Also had to `git rm --cached "#recycle/desktop.ini"` to unstage it.
- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.
- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.
- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.
- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.
5. Problem Solving:
- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.
- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.
- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).
- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.
6. All User Messages:
- "do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps."
- "doi I need to restart?"
- "there is sudo docker compose"
- "no still the same"
- "add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git"
- "just do it" (re: git push)
- "how to make sure data in :8767 are accurate and point to archive.db"
- "I can't see older than 16th there should 21st of april. In http://[IP_ADDRESS]:8766/ I can see all but not on sqlite viewer http://[IP_ADDRESS]:8767"
- "ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive"
- [docker compose output showing orphan container error]
- "looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast"
- "lets make the playing speed more than 8x"
- "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
7. Pending Tasks:
- **Playback speed fix** (in progress, partially done):
- Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` inside `ttInner` HTML
- Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions
- Update speed select `onchange` to call `ttSetSpeed(+this.value)`
- Add 64× option to speed select
- Update `_ttMovePlayhead` to also update `ttPlayheadTime` label
- Update `ttSyncBtn` to start/stop timer based on play state + speed
- Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)
- Rebuild Docker image after changes
8. Current Work:
Working on fixing two issues with the Timetable tab:
1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.
2. **Timeline position indicator**: Playhead not prominent enough.
**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:
```css
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
```
Session was interrupted by summary request after this CSS edit, mid-implementation.
9. Optional Next Step:
Continuing the fix for: "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
The next steps in order are:
1. Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)
2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`
3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)
4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option
5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer
6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`
If you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl
Continue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with "I'll continue" or similar. Pick up the last task as if the break never happened.
Thinking
Thinking
Bash
Find timetable speed and playhead related code
IN
grep -n "tt-playhead\|ttPlayhead\|ttInner\|_ttMovePlayhead\|ttSetSpeed\|_ttStartSpeed\|_ttStopSpeed\|ttSyncBtn\|playbackRate\|speed.*select\|spdSel\|ttSpeed" /volume1/screenpipe/app/static/index.html | head -80
Copy code to clipboard
OUT
207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
580: <div class="tt-inner" id="ttInner" onclick="ttTimelineClick(event)">
583: <div class="tt-playhead" id="ttPlayhead"></div>
598: onpause="ttSyncBtn()"
599: onplay="ttSyncBtn()">
607: <select id="ttSpeed" onchange="document.getElementById('ttVideo').playbackRate=+this.value">
1624: document.getElementById('ttInner').style.width = '100%';
1632: document.getElementById('ttPlayhead').style.display = 'none';
1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';
1700: const inner = document.getElementById('ttInner');
1710: const inner = document.getElementById('ttInner');
1718: const inner = document.getElementById('ttInner');
1750: _ttMovePlayhead(new Date(best.ts).getTime());
1772: _ttMovePlayhead(new Date(best.ts).getTime());
1791:function _ttMovePlayhead(tsMs) {
1792: const ph = document.getElementById('ttPlayhead');
1802: const ph = document.getElementById('ttPlayhead');
1805: const inner = document.getElementById('ttInner');
1819:function ttSyncBtn() {
Read
index.html
index.html
(lines 576-625)
Read
index.html
index.html
(lines 1786-1865)
Thinking
Thinking
Bash
Find chunk loading and playhead update functions
IN
grep -n "ttUpdatePlayhead\|ttNextChunk\|ttLoadChunk\|_ttCurChunk\|_ttChunks\|_ttFrames" /volume1/screenpipe/app/static/index.html | head -50
Copy code to clipboard
OUT
596: onended="ttNextChunk()"
597: ontimeupdate="ttUpdatePlayhead()"
1569:let _ttFrames = [];
1570:let _ttChunks = [];
1571:let _ttCurChunk = -1;
1607: _ttFrames = data.frames;
1609: for (const f of _ttFrames) {
1613: _ttChunks = [...chunkMap.values()];
1614: _ttCurChunk = -1;
1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();
1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();
1620: for (const f of _ttFrames) _ttColor(f.app);
1640: for (const f of _ttFrames) {
1736: if (!_ttFrames.length) return;
1737: let best = _ttFrames[0], minDiff = Infinity;
1738: for (const f of _ttFrames) {
1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);
1744: _ttCurChunk = ci;
1753:function ttNextChunk() {
1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;
1755: _ttCurChunk++;
1757: video.src = _ttChunks[_ttCurChunk][0].video_url;
1762:function ttUpdatePlayhead() {
1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;
1765: const chunk = _ttChunks[_ttCurChunk];
Read
index.html
index.html
(lines 1754-1793)
Thinking
Thinking
Read
index.html
index.html
(lines 1701-1760)
Thinking
Thinking
Read
index.html
index.html
(lines 1561-1640)
Thinking
Thinking
Bash
Find time formatting functions
IN
grep -n "function fmtTime\|function fmtDate\|function _fmt\|localTimeToUtc\|fmtDateTime" /volume1/screenpipe/app/static/index.html | head -20
Copy code to clipboard
OUT
1088: if (tf) url += `&time_from=${localTimeToUtc(tf)}`;
1089: if (tt) url += `&time_to=${localTimeToUtc(tt)}`;
1153: let meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge}`;
1166: meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge} <span class="badge ${r.is_input_device?'mic':'sys'}">${r.is_input_device?'MIC':'SYS'}</span>`;
1307:function fmtTime(ts) {
1312:function fmtDateTime(ts) {
1320:function localTimeToUtc(timeStr) {
1778:function _fmtSec(s) {
1788: `${fmtDateTime(f.ts)} · ${f.app}${f.win ? ' / ' + f.win : ''}`;
Read
index.html
index.html
(lines 1308-1327)
Thinking
Thinking
Now I have everything I need. I'll implement the frame-by-frame timer system that replaces
video.playbackRate
with wall-clock accurate playback, plus add the playhead time label. Let me make the changes:
Edit
index.html
index.html
Added 1 line...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Explorer (⇧⌘E)","depth":19,"bounds":{"left":0.0,"top":0.047885075,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.057462092,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXRadioButton","text":"Search (⇧⌘F)","depth":19,"bounds":{"left":0.0,"top":0.08619314,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.09577015,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXRadioButton","text":"Source Control (⌃⇧G) - 2 pending changes","depth":19,"bounds":{"left":0.0,"top":0.1245012,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.13407822,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXStaticText","text":"2","depth":22,"bounds":{"left":0.009640957,"top":0.1452514,"width":0.0019946808,"height":0.008778931},"role_description":"text"},{"role":"AXRadioButton","text":"Run and Debug (⇧⌘D)","depth":19,"bounds":{"left":0.0,"top":0.16280925,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.17238627,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXRadioButton","text":"Remote Explorer","depth":19,"bounds":{"left":0.0,"top":0.20111732,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.21069433,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXRadioButton","text":"Extensions (⇧⌘X) - 2 require update, 1 requires restart","depth":19,"bounds":{"left":0.0,"top":0.23942538,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.2490024,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXStaticText","text":"3","depth":22,"bounds":{"left":0.00930851,"top":0.2601756,"width":0.0023271276,"height":0.008778931},"role_description":"text"},{"role":"AXRadioButton","text":"Claude Code","depth":19,"bounds":{"left":0.0,"top":0.27773345,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"Containers","depth":19,"bounds":{"left":0.0,"top":0.3160415,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"EXPLORER","depth":17,"bounds":{"left":0.022606382,"top":0.047885075,"width":0.018949468,"height":0.02793296},"role_description":"heading"},{"role":"AXStaticText","text":"EXPLORER","depth":18,"bounds":{"left":0.022606382,"top":0.056664005,"width":0.018949468,"height":0.0103751},"role_description":"text"},{"role":"AXButton","text":"Explorer Section: screenpipe [SSH: nas]","depth":21,"bounds":{"left":0.015957447,"top":0.07581804,"width":0.09940159,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.07821229,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXHeading","text":"Explorer Section: screenpipe [SSH: nas]","depth":22,"bounds":{"left":0.022606382,"top":0.07581804,"width":0.045877658,"height":0.017557861},"role_description":"heading"},{"role":"AXStaticText","text":"SCREENPIPE [SSH: NAS]","depth":23,"bounds":{"left":0.022606382,"top":0.079010375,"width":0.045877658,"height":0.0103751},"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.09577015,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"#recycle","depth":27,"bounds":{"left":0.025930852,"top":0.09577015,"width":0.017287234,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.11332801,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"app","depth":27,"bounds":{"left":0.025930852,"top":0.11332801,"width":0.0076462766,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.10605053,"top":0.11412609,"width":0.004654255,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.13088587,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"data","depth":27,"bounds":{"left":0.025930852,"top":0.13088587,"width":0.008976064,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.14844373,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"pipes","depth":27,"bounds":{"left":0.025930852,"top":0.14844373,"width":0.010970744,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.16440542,"width":0.0063164895,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":".gitignore","depth":27,"bounds":{"left":0.025930852,"top":0.1660016,"width":0.018949468,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.1819633,"width":0.0063164895,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"app_settings.json","depth":27,"bounds":{"left":0.025930852,"top":0.18355946,"width":0.03557181,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.19952115,"width":0.0076462766,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"archive.db","depth":27,"bounds":{"left":0.025930852,"top":0.20111732,"width":0.020944148,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.21707901,"width":0.0076462766,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"db.sqlite","depth":27,"bounds":{"left":0.025930852,"top":0.21867518,"width":0.017287234,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.23463687,"width":0.0063164895,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"screenpipe_sync.sh","depth":27,"bounds":{"left":0.025930852,"top":0.23623304,"width":0.039893616,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.25219473,"width":0.0076462766,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"screenpipe.db","depth":27,"bounds":{"left":0.025930852,"top":0.25379092,"width":0.028590426,"height":0.011971269},"role_description":"text"},{"role":"AXButton","text":"Outline Section","depth":21,"bounds":{"left":0.015957447,"top":0.9473264,"width":0.09940159,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.9497207,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXHeading","text":"OUTLINE","depth":22,"bounds":{"left":0.022606382,"top":0.9473264,"width":0.01662234,"height":0.017557861},"role_description":"heading"},{"role":"AXStaticText","text":"OUTLINE","depth":23,"bounds":{"left":0.022606382,"top":0.95131683,"width":0.01662234,"height":0.0103751},"role_description":"text"},{"role":"AXButton","text":"Timeline Section","depth":21,"bounds":{"left":0.015957447,"top":0.9648843,"width":0.09940159,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.96727854,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXHeading","text":"TIMELINE","depth":22,"bounds":{"left":0.022606382,"top":0.9648843,"width":0.01761968,"height":0.017557861},"role_description":"heading"},{"role":"AXStaticText","text":"TIMELINE","depth":23,"bounds":{"left":0.022606382,"top":0.9688747,"width":0.01761968,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"app_settings.json, Editor Group 1","depth":28,"bounds":{"left":0.11569149,"top":0.047885075,"width":0.055851065,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe_sync.sh, Editor Group 1","depth":28,"bounds":{"left":0.17154256,"top":0.047885075,"width":0.06050532,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":"db.sqlite-shm, preview, Editor Group 1","depth":28,"bounds":{"left":0.23171543,"top":0.047885075,"width":0.04886968,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/Test/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","depth":28,"bounds":{"left":0.13763298,"top":0.33758977,"width":0.38031915,"height":0.014365523},"value":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/Test/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","role_description":"editor","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/Test/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","depth":29,"bounds":{"left":0.13763298,"top":0.33758977,"width":0.35804522,"height":0.014365523},"role_description":"text"},{"role":"AXRadioButton","text":"lets add ability to jump…, Editor Group 2","depth":28,"bounds":{"left":0.5578458,"top":0.047885075,"width":0.06948138,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":"Problems (⇧⌘M)","depth":22,"bounds":{"left":0.118351065,"top":0.59936154,"width":0.027925532,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PROBLEMS","depth":24,"bounds":{"left":0.122340426,"top":0.60814047,"width":0.019946808,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Output (⇧⌘U)","depth":22,"bounds":{"left":0.14594415,"top":0.59936154,"width":0.023603724,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUTPUT","depth":24,"bounds":{"left":0.14993352,"top":0.60814047,"width":0.015625,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Debug Console (⇧⌘Y)","depth":22,"bounds":{"left":0.16921543,"top":0.59936154,"width":0.039893616,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"DEBUG CONSOLE","depth":24,"bounds":{"left":0.1732048,"top":0.60814047,"width":0.031914894,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Terminal (⌃`)","depth":22,"bounds":{"left":0.2087766,"top":0.59936154,"width":0.026595745,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"TERMINAL","depth":24,"bounds":{"left":0.21276596,"top":0.60814047,"width":0.01861702,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Ports","depth":22,"bounds":{"left":0.23537233,"top":0.59936154,"width":0.020279255,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PORTS","depth":24,"bounds":{"left":0.2393617,"top":0.60814047,"width":0.012300532,"height":0.0103751},"role_description":"text"},{"role":"AXButton","text":"remote SSH: nas","depth":16,"bounds":{"left":0.0006648936,"top":0.98244214,"width":0.028590426,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.0033244682,"top":0.9848364,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"SSH: nas","depth":17,"bounds":{"left":0.008643617,"top":0.9856345,"width":0.017952127,"height":0.011173184},"role_description":"text"},{"role":"AXButton","text":"screenpipe (Git) - master*, Checkout Branch/Tag...","depth":16,"bounds":{"left":0.030917553,"top":0.98244214,"width":0.023271276,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.031914894,"top":0.9848364,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"master*","depth":17,"bounds":{"left":0.03723404,"top":0.9856345,"width":0.015957447,"height":0.011173184},"role_description":"text"},{"role":"AXButton","text":"screenpipe (Git) - Synchronize Changes","depth":16,"bounds":{"left":0.05418883,"top":0.98244214,"width":0.00731383,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"No Problems","depth":16,"bounds":{"left":0.06416223,"top":0.98244214,"width":0.022606382,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.06582447,"top":0.9848364,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"bounds":{"left":0.07114362,"top":0.9856345,"width":0.004986702,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.07579787,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"bounds":{"left":0.08111702,"top":0.9856345,"width":0.0039893617,"height":0.011173184},"role_description":"text"},{"role":"AXButton","text":"No Ports Forwarded","depth":16,"bounds":{"left":0.08843085,"top":0.98244214,"width":0.012632979,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.09009308,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"bounds":{"left":0.09541223,"top":0.9856345,"width":0.0039893617,"height":0.011173184},"role_description":"text"},{"role":"AXButton","text":"Notifications","depth":16,"bounds":{"left":0.9886968,"top":0.98244214,"width":0.010638298,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Signed out","depth":16,"bounds":{"left":0.9567819,"top":0.98244214,"width":0.031914894,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.9594415,"top":0.9848364,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Signed out","depth":17,"bounds":{"left":0.96476066,"top":0.9856345,"width":0.021276595,"height":0.011173184},"role_description":"text"},{"role":"AXButton","text":"Shell Script","depth":16,"bounds":{"left":0.93151593,"top":0.98244214,"width":0.023603724,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions","depth":16,"bounds":{"left":0.92420214,"top":0.98244214,"width":0.0076462766,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"LF","depth":16,"bounds":{"left":0.91356385,"top":0.98244214,"width":0.00831117,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"UTF-8","depth":16,"bounds":{"left":0.8962766,"top":0.98244214,"width":0.015625,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Spaces: 2","depth":16,"bounds":{"left":0.87234044,"top":0.98244214,"width":0.021941489,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Ln 18, Col 36","depth":16,"bounds":{"left":0.84142286,"top":0.98244214,"width":0.028922873,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Screen Reader Optimized","depth":16,"bounds":{"left":0.78723407,"top":0.98244214,"width":0.053523935,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"git-commit Lukas Kovalik (23 hours ago)","depth":16,"bounds":{"left":0.6984708,"top":0.98244214,"width":0.06416223,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.70013297,"top":0.9848364,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Lukas Kovalik (23 hours ago)","depth":17,"bounds":{"left":0.70545214,"top":0.9856345,"width":0.055518616,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"Info: Downloading VS Code Server...","depth":12,"role_description":"text"},{"role":"AXButton","text":"lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time","depth":19,"bounds":{"left":0.56017286,"top":0.08060654,"width":0.099734046,"height":0.022346368},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Session history","depth":19,"bounds":{"left":0.9780585,"top":0.08060654,"width":0.00930851,"height":0.022346368},"help_text":"Session history","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New session","depth":19,"bounds":{"left":0.9886968,"top":0.08060654,"width":0.00930851,"height":0.022346368},"help_text":"New session","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Message actions","depth":24,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.\n\nSummary:\n1. Primary Request and Intent:\n\nThe user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:\n- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.\n- **Q2**: AND combination search (term1 + term2 must both appear) → Added \"AND also\" input field.\n- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.\n- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.\n- **Q5**: \"still the same\" (container not picking up config) → Explained `up -d` vs `restart`.\n- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.\n- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.\n- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.\n- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.\n\n2. Key Technical Concepts:\n\n- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.\n- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.\n- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.\n- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.\n- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.\n- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.\n- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.\n- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.\n- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.\n- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.\n- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\\#recycle/`.\n\n3. Files and Code Sections:\n\n- **`/volume1/screenpipe/app/main.py`**\n - Added `/api/apps` endpoint (all unique app names from frames table)\n - Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)\n - `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: \"...\"}`\n - Key snippet:\n ```python","depth":26,"role_description":"text"},{"role":"AXButton","text":"@app.get(\"/api/timetable\"","depth":26,"help_text":"Open app.get(\"/api/timetable\"","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":")\n async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):\n ...\n rows = conn.execute(f\"\"\"\n SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,\n f.offset_index, f.snapshot_path,\n vc.file_path AS video_path, vc.fps AS video_fps\n FROM frames f\n JOIN video_chunks vc ON f.video_chunk_id = vc.id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND f.video_chunk_id IS NOT NULL {dev_clause}\n ORDER BY f.timestamp\n \"\"\", params).fetchall()\n # seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)\n ```\n\n- **`/volume1/screenpipe/app/docker-compose.yml`**\n - Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`\n - Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`\n - screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`\n\n- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)\n - **Search enhancements**:\n - Added `id=\"sq2\"` \"AND also\" input between search-row1 and search-row2\n - Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id=\"msOnlyApps\"`, `id=\"msSkipApps\"`)\n - Updated `buildUrl()` to combine `q + \" \" + q2` and convert times with `localTimeToUtc()`\n - Added `fmtDateTime(ts)` showing \"Apr 20 14:08\" format\n - Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC\n - Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`\n - **Timetable tab** (new page):\n - Tab button added between Work Report and AI Summary\n - `showPage` array updated: `['activity','search','audio','report','timetable','summary']`\n - `refresh()` calls `loadTimetable()` when on timetable page\n - **Timetable CSS** (key styles):\n ```css\n .tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }\n .tt-inner { position:relative; height:52px; } /* width set dynamically */\n .tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n .tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n .tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }\n .tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }\n ```\n - **Timetable JS state variables**:\n ```javascript\n let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;\n let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;\n const _ttAppColors = {};\n const TT_ZOOMS = [1, 2, 4, 8, 16, 32];\n const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};\n ```\n - **Key JS functions**:\n - `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders\n - `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead\n - `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)\n - `ttOverviewClick(e)` — scrolls timeline + seeks video\n - `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`\n - `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`\n - `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video\n - `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked\n - `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`\n - `_ttShowNow(f)` — updates screenshot thumbnail + now-text div\n - `ttSyncBtn()` — syncs play/pause button text\n - Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom\n\n- **`/volume1/screenpipe/.gitignore`**\n ```\n *.db, *.sqlite, *.sqlite-shm, *.sqlite-wal\n data/, \\#recycle/,","depth":26,"role_description":"text"},{"role":"AXButton","text":"@eaDir/","depth":26,"help_text":"Open eaDir/","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"app_settings.json, app/.env\n __pycache__/, *.pyc, .DS_Store\n ```\n\n4. Errors and Fixes:\n\n- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\\#recycle/`. Also had to `git rm --cached \"#recycle/desktop.ini\"` to unstage it.\n- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.\n- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.\n- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.\n- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.\n\n5. Problem Solving:\n\n- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.\n- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.\n- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).\n- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.\n\n6. All User Messages:\n\n- \"do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps.\"\n- \"doi I need to restart?\"\n- \"there is sudo docker compose\"\n- \"no still the same\"\n- \"add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git\"\n- \"just do it\" (re: git push)\n- \"how to make sure data in :8767 are accurate and point to archive.db\"\n- \"I can't see older than 16th there should 21st of april. In http://192.168.0.242:8766/ I can see all but not on sqlite viewer http://192.168.0.242:8767\"\n- \"ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive\"\n- [docker compose output showing orphan container error]\n- \"looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast\"\n- \"lets make the playing speed more than 8x\"\n- \"still playing speed is not showing properly still just in one second. also I want to see in timeline where I am\"\n\n7. Pending Tasks:\n\n- **Playback speed fix** (in progress, partially done):\n - Add `<div class=\"tt-playhead-time\" id=\"ttPlayheadTime\"></div>` inside `ttInner` HTML\n - Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions\n - Update speed select `onchange` to call `ttSetSpeed(+this.value)`\n - Add 64× option to speed select\n - Update `_ttMovePlayhead` to also update `ttPlayheadTime` label\n - Update `ttSyncBtn` to start/stop timer based on play state + speed\n - Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)\n - Rebuild Docker image after changes\n\n8. Current Work:\n\nWorking on fixing two issues with the Timetable tab:\n1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.\n2. **Timeline position indicator**: Playhead not prominent enough. \n\n**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:\n```css\n.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n```\n\nSession was interrupted by summary request after this CSS edit, mid-implementation.\n\n9. Optional Next Step:\n\nContinuing the fix for: \"still playing speed is not showing properly still just in one second. also I want to see in timeline where I am\"\n\nThe next steps in order are:\n1. Add `<div class=\"tt-playhead-time\" id=\"ttPlayheadTime\"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)\n2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`\n3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)\n4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option\n5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer\n6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`\n\nIf you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl\nContinue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with \"I'll continue\" or similar. Pick up the last task as if the break never happened.","depth":26,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find timetable speed and playhead related code","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"tt-playhead\\|ttPlayhead\\|ttInner\\|_ttMovePlayhead\\|ttSetSpeed\\|_ttStartSpeed\\|_ttStopSpeed\\|ttSyncBtn\\|playbackRate\\|speed.*select\\|spdSel\\|ttSpeed\" /volume1/screenpipe/app/static/index.html | head -80","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n580: <div class=\"tt-inner\" id=\"ttInner\" onclick=\"ttTimelineClick(event)\">\n583: <div class=\"tt-playhead\" id=\"ttPlayhead\"></div>\n598: onpause=\"ttSyncBtn()\"\n599: onplay=\"ttSyncBtn()\">\n607: <select id=\"ttSpeed\" onchange=\"document.getElementById('ttVideo').playbackRate=+this.value\">\n1624: document.getElementById('ttInner').style.width = '100%';\n1632: document.getElementById('ttPlayhead').style.display = 'none';\n1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';\n1700: const inner = document.getElementById('ttInner');\n1710: const inner = document.getElementById('ttInner');\n1718: const inner = document.getElementById('ttInner');\n1750: _ttMovePlayhead(new Date(best.ts).getTime());\n1772: _ttMovePlayhead(new Date(best.ts).getTime());\n1791:function _ttMovePlayhead(tsMs) {\n1792: const ph = document.getElementById('ttPlayhead');\n1802: const ph = document.getElementById('ttPlayhead');\n1805: const inner = document.getElementById('ttInner');\n1819:function ttSyncBtn() {","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 576-625)","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1786-1865)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find chunk loading and playhead update functions","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"ttUpdatePlayhead\\|ttNextChunk\\|ttLoadChunk\\|_ttCurChunk\\|_ttChunks\\|_ttFrames\" /volume1/screenpipe/app/static/index.html | head -50","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"596: onended=\"ttNextChunk()\"\n597: ontimeupdate=\"ttUpdatePlayhead()\"\n1569:let _ttFrames = [];\n1570:let _ttChunks = [];\n1571:let _ttCurChunk = -1;\n1607: _ttFrames = data.frames;\n1609: for (const f of _ttFrames) {\n1613: _ttChunks = [...chunkMap.values()];\n1614: _ttCurChunk = -1;\n1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();\n1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();\n1620: for (const f of _ttFrames) _ttColor(f.app);\n1640: for (const f of _ttFrames) {\n1736: if (!_ttFrames.length) return;\n1737: let best = _ttFrames[0], minDiff = Infinity;\n1738: for (const f of _ttFrames) {\n1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);\n1744: _ttCurChunk = ci;\n1753:function ttNextChunk() {\n1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;\n1755: _ttCurChunk++;\n1757: video.src = _ttChunks[_ttCurChunk][0].video_url;\n1762:function ttUpdatePlayhead() {\n1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;\n1765: const chunk = _ttChunks[_ttCurChunk];","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1754-1793)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1701-1760)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1561-1640)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find time formatting functions","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"function fmtTime\\|function fmtDate\\|function _fmt\\|localTimeToUtc\\|fmtDateTime\" /volume1/screenpipe/app/static/index.html | head -20","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"1088: if (tf) url += `&time_from=${localTimeToUtc(tf)}`;\n1089: if (tt) url += `&time_to=${localTimeToUtc(tt)}`;\n1153: let meta = `<span style=\"color:var(--muted)\">${fmtDateTime(r.timestamp)}</span>${srcBadge}`;\n1166: meta = `<span style=\"color:var(--muted)\">${fmtDateTime(r.timestamp)}</span>${srcBadge} <span class=\"badge ${r.is_input_device?'mic':'sys'}\">${r.is_input_device?'MIC':'SYS'}</span>`;\n1307:function fmtTime(ts) {\n1312:function fmtDateTime(ts) {\n1320:function localTimeToUtc(timeStr) {\n1778:function _fmtSec(s) {\n1788: `${fmtDateTime(f.ts)} · ${f.app}${f.win ? ' / ' + f.win : ''}`;","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1308-1327)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Now I have everything I need. I'll implement the frame-by-frame timer system that replaces","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"video.playbackRate","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"with wall-clock accurate playback, plus add the playhead time label. Let me make the changes:","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Edit","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Added 1 line","depth":24,"role_description":"text"}]...
|
-7154737439082718636
|
4474475550963076503
|
click
|
accessibility
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G) - 2 pending changes
2
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: nas]
Explorer Section: screenpipe [SSH: nas]
SCREENPIPE [SSH: NAS]
#recycle
app
data
pipes
.gitignore
app_settings.json
archive.db
db.sqlite
screenpipe_sync.sh
screenpipe.db
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
app_settings.json, Editor Group 1
screenpipe_sync.sh, Editor Group 1
db.sqlite-shm, preview, Editor Group 1
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Test/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lets add ability to jump…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: nas
SSH: nas
screenpipe (Git) - master*, Checkout Branch/Tag...
master*
screenpipe (Git) - Synchronize Changes
No Problems
0
0
No Ports Forwarded
0
Notifications
Signed out
Signed out
Shell Script
Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions
LF
UTF-8
Spaces: 2
Ln 18, Col 36
Screen Reader Optimized
git-commit Lukas Kovalik (23 hours ago)
Lukas Kovalik (23 hours ago)
Info: Downloading VS Code Server...
lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time
Session history
New session
Message actions
This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.
Summary:
1. Primary Request and Intent:
The user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:
- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.
- **Q2**: AND combination search (term1 + term2 must both appear) → Added "AND also" input field.
- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.
- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.
- **Q5**: "still the same" (container not picking up config) → Explained `up -d` vs `restart`.
- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.
- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.
- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.
- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.
2. Key Technical Concepts:
- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.
- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.
- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.
- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.
- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.
- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.
- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.
- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.
- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.
- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.
- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\#recycle/`.
3. Files and Code Sections:
- **`/volume1/screenpipe/app/main.py`**
- Added `/api/apps` endpoint (all unique app names from frames table)
- Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)
- `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: "..."}`
- Key snippet:
```python
@app.get("/api/timetable"
)
async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):
...
rows = conn.execute(f"""
SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,
f.offset_index, f.snapshot_path,
vc.file_path AS video_path, vc.fps AS video_fps
FROM frames f
JOIN video_chunks vc ON f.video_chunk_id = vc.id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND f.video_chunk_id IS NOT NULL {dev_clause}
ORDER BY f.timestamp
""", params).fetchall()
# seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)
```
- **`/volume1/screenpipe/app/docker-compose.yml`**
- Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`
- Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`
- screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`
- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)
- **Search enhancements**:
- Added `id="sq2"` "AND also" input between search-row1 and search-row2
- Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id="msOnlyApps"`, `id="msSkipApps"`)
- Updated `buildUrl()` to combine `q + " " + q2` and convert times with `localTimeToUtc()`
- Added `fmtDateTime(ts)` showing "Apr 20 14:08" format
- Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC
- Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`
- **Timetable tab** (new page):
- Tab button added between Work Report and AI Summary
- `showPage` array updated: `['activity','search','audio','report','timetable','summary']`
- `refresh()` calls `loadTimetable()` when on timetable page
- **Timetable CSS** (key styles):
```css
.tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }
.tt-inner { position:relative; height:52px; } /* width set dynamically */
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
.tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }
.tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }
```
- **Timetable JS state variables**:
```javascript
let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;
let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;
const _ttAppColors = {};
const TT_ZOOMS = [1, 2, 4, 8, 16, 32];
const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};
```
- **Key JS functions**:
- `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders
- `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead
- `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)
- `ttOverviewClick(e)` — scrolls timeline + seeks video
- `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`
- `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`
- `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video
- `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked
- `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`
- `_ttShowNow(f)` — updates screenshot thumbnail + now-text div
- `ttSyncBtn()` — syncs play/pause button text
- Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom
- **`/volume1/screenpipe/.gitignore`**
```
*.db, *.sqlite, *.sqlite-shm, *.sqlite-wal
data/, \#recycle/,
@eaDir/
app_settings.json, app/.env
__pycache__/, *.pyc, .DS_Store
```
4. Errors and Fixes:
- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\#recycle/`. Also had to `git rm --cached "#recycle/desktop.ini"` to unstage it.
- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.
- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.
- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.
- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.
5. Problem Solving:
- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.
- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.
- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).
- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.
6. All User Messages:
- "do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps."
- "doi I need to restart?"
- "there is sudo docker compose"
- "no still the same"
- "add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git"
- "just do it" (re: git push)
- "how to make sure data in :8767 are accurate and point to archive.db"
- "I can't see older than 16th there should 21st of april. In http://[IP_ADDRESS]:8766/ I can see all but not on sqlite viewer http://[IP_ADDRESS]:8767"
- "ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive"
- [docker compose output showing orphan container error]
- "looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast"
- "lets make the playing speed more than 8x"
- "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
7. Pending Tasks:
- **Playback speed fix** (in progress, partially done):
- Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` inside `ttInner` HTML
- Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions
- Update speed select `onchange` to call `ttSetSpeed(+this.value)`
- Add 64× option to speed select
- Update `_ttMovePlayhead` to also update `ttPlayheadTime` label
- Update `ttSyncBtn` to start/stop timer based on play state + speed
- Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)
- Rebuild Docker image after changes
8. Current Work:
Working on fixing two issues with the Timetable tab:
1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.
2. **Timeline position indicator**: Playhead not prominent enough.
**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:
```css
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
```
Session was interrupted by summary request after this CSS edit, mid-implementation.
9. Optional Next Step:
Continuing the fix for: "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
The next steps in order are:
1. Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)
2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`
3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)
4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option
5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer
6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`
If you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl
Continue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with "I'll continue" or similar. Pick up the last task as if the break never happened.
Thinking
Thinking
Bash
Find timetable speed and playhead related code
IN
grep -n "tt-playhead\|ttPlayhead\|ttInner\|_ttMovePlayhead\|ttSetSpeed\|_ttStartSpeed\|_ttStopSpeed\|ttSyncBtn\|playbackRate\|speed.*select\|spdSel\|ttSpeed" /volume1/screenpipe/app/static/index.html | head -80
Copy code to clipboard
OUT
207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
580: <div class="tt-inner" id="ttInner" onclick="ttTimelineClick(event)">
583: <div class="tt-playhead" id="ttPlayhead"></div>
598: onpause="ttSyncBtn()"
599: onplay="ttSyncBtn()">
607: <select id="ttSpeed" onchange="document.getElementById('ttVideo').playbackRate=+this.value">
1624: document.getElementById('ttInner').style.width = '100%';
1632: document.getElementById('ttPlayhead').style.display = 'none';
1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';
1700: const inner = document.getElementById('ttInner');
1710: const inner = document.getElementById('ttInner');
1718: const inner = document.getElementById('ttInner');
1750: _ttMovePlayhead(new Date(best.ts).getTime());
1772: _ttMovePlayhead(new Date(best.ts).getTime());
1791:function _ttMovePlayhead(tsMs) {
1792: const ph = document.getElementById('ttPlayhead');
1802: const ph = document.getElementById('ttPlayhead');
1805: const inner = document.getElementById('ttInner');
1819:function ttSyncBtn() {
Read
index.html
index.html
(lines 576-625)
Read
index.html
index.html
(lines 1786-1865)
Thinking
Thinking
Bash
Find chunk loading and playhead update functions
IN
grep -n "ttUpdatePlayhead\|ttNextChunk\|ttLoadChunk\|_ttCurChunk\|_ttChunks\|_ttFrames" /volume1/screenpipe/app/static/index.html | head -50
Copy code to clipboard
OUT
596: onended="ttNextChunk()"
597: ontimeupdate="ttUpdatePlayhead()"
1569:let _ttFrames = [];
1570:let _ttChunks = [];
1571:let _ttCurChunk = -1;
1607: _ttFrames = data.frames;
1609: for (const f of _ttFrames) {
1613: _ttChunks = [...chunkMap.values()];
1614: _ttCurChunk = -1;
1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();
1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();
1620: for (const f of _ttFrames) _ttColor(f.app);
1640: for (const f of _ttFrames) {
1736: if (!_ttFrames.length) return;
1737: let best = _ttFrames[0], minDiff = Infinity;
1738: for (const f of _ttFrames) {
1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);
1744: _ttCurChunk = ci;
1753:function ttNextChunk() {
1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;
1755: _ttCurChunk++;
1757: video.src = _ttChunks[_ttCurChunk][0].video_url;
1762:function ttUpdatePlayhead() {
1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;
1765: const chunk = _ttChunks[_ttCurChunk];
Read
index.html
index.html
(lines 1754-1793)
Thinking
Thinking
Read
index.html
index.html
(lines 1701-1760)
Thinking
Thinking
Read
index.html
index.html
(lines 1561-1640)
Thinking
Thinking
Bash
Find time formatting functions
IN
grep -n "function fmtTime\|function fmtDate\|function _fmt\|localTimeToUtc\|fmtDateTime" /volume1/screenpipe/app/static/index.html | head -20
Copy code to clipboard
OUT
1088: if (tf) url += `&time_from=${localTimeToUtc(tf)}`;
1089: if (tt) url += `&time_to=${localTimeToUtc(tt)}`;
1153: let meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge}`;
1166: meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge} <span class="badge ${r.is_input_device?'mic':'sys'}">${r.is_input_device?'MIC':'SYS'}</span>`;
1307:function fmtTime(ts) {
1312:function fmtDateTime(ts) {
1320:function localTimeToUtc(timeStr) {
1778:function _fmtSec(s) {
1788: `${fmtDateTime(f.ts)} · ${f.app}${f.win ? ' / ' + f.win : ''}`;
Read
index.html
index.html
(lines 1308-1327)
Thinking
Thinking
Now I have everything I need. I'll implement the frame-by-frame timer system that replaces
video.playbackRate
with wall-clock accurate playback, plus add the playhead time label. Let me make the changes:
Edit
index.html
index.html
Added 1 line...
|
81026
|
NULL
|
|
81312
|
2162
|
7
|
2026-04-25T16:11:03.629635+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-25/1777 /Users/lukas/.screenpipe/data/data/2026-04-25/1777133463629_m1.jpg...
|
Code
|
screenpipe_sync.sh — screenpipe [SSH: nas]
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Source Control (⌃⇧G) - 2 pending changes
2
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: nas]
Explorer Section: screenpipe [SSH: nas]
SCREENPIPE [SSH: NAS]
#recycle
app
data
pipes
.gitignore
app_settings.json
archive.db
db.sqlite
screenpipe_sync.sh
screenpipe.db
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
app_settings.json, Editor Group 1
screenpipe_sync.sh, Editor Group 1
db.sqlite-shm, preview, Editor Group 1
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lets add ability to jump…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: nas
SSH: nas
screenpipe (Git) - master*, Checkout Branch/Tag...
master*
screenpipe (Git) - Synchronize Changes
No Problems
0
0
No Ports Forwarded
0
Notifications
Signed out
Signed out
Shell Script
Editor Language Status: Inline Suggestions, next: $(copilot) No inline suggestion available, Inline suggestions
LF
UTF-8
Spaces: 2
Ln 352, Col 47 (13091 selected)
Screen Reader Optimized
git-commit Lukas Kovalik (23 hours ago)
Lukas Kovalik (23 hours ago)
Info: Downloading VS Code Server...
lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time
Session history
New session
Message actions
This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.
Summary:
1. Primary Request and Intent:
The user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:
- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.
- **Q2**: AND combination search (term1 + term2 must both appear) → Added "AND also" input field.
- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.
- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.
- **Q5**: "still the same" (container not picking up config) → Explained `up -d` vs `restart`.
- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.
- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.
- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.
- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.
2. Key Technical Concepts:
- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.
- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.
- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.
- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.
- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.
- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.
- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.
- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.
- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.
- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.
- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\#recycle/`.
3. Files and Code Sections:
- **`/volume1/screenpipe/app/main.py`**
- Added `/api/apps` endpoint (all unique app names from frames table)
- Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)
- `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: "..."}`
- Key snippet:
```python
@app.get("/api/timetable"
)
async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):
...
rows = conn.execute(f"""
SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,
f.offset_index, f.snapshot_path,
vc.file_path AS video_path, vc.fps AS video_fps
FROM frames f
JOIN video_chunks vc ON f.video_chunk_id = vc.id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND f.video_chunk_id IS NOT NULL {dev_clause}
ORDER BY f.timestamp
""", params).fetchall()
# seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)
```
- **`/volume1/screenpipe/app/docker-compose.yml`**
- Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`
- Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`
- screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`
- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)
- **Search enhancements**:
- Added `id="sq2"` "AND also" input between search-row1 and search-row2
- Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id="msOnlyApps"`, `id="msSkipApps"`)
- Updated `buildUrl()` to combine `q + " " + q2` and convert times with `localTimeToUtc()`
- Added `fmtDateTime(ts)` showing "Apr 20 14:08" format
- Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC
- Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`
- **Timetable tab** (new page):
- Tab button added between Work Report and AI Summary
- `showPage` array updated: `['activity','search','audio','report','timetable','summary']`
- `refresh()` calls `loadTimetable()` when on timetable page
- **Timetable CSS** (key styles):
```css
.tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }
.tt-inner { position:relative; height:52px; } /* width set dynamically */
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
.tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }
.tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }
```
- **Timetable JS state variables**:
```javascript
let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;
let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;
const _ttAppColors = {};
const TT_ZOOMS = [1, 2, 4, 8, 16, 32];
const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};
```
- **Key JS functions**:
- `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders
- `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead
- `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)
- `ttOverviewClick(e)` — scrolls timeline + seeks video
- `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`
- `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`
- `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video
- `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked
- `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`
- `_ttShowNow(f)` — updates screenshot thumbnail + now-text div
- `ttSyncBtn()` — syncs play/pause button text
- Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom
- **`/volume1/screenpipe/.gitignore`**
```
*.db, *.sqlite, *.sqlite-shm, *.sqlite-wal
data/, \#recycle/,
@eaDir/
app_settings.json, app/.env
__pycache__/, *.pyc, .DS_Store
```
4. Errors and Fixes:
- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\#recycle/`. Also had to `git rm --cached "#recycle/desktop.ini"` to unstage it.
- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.
- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.
- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.
- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.
5. Problem Solving:
- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.
- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.
- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).
- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.
6. All User Messages:
- "do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps."
- "doi I need to restart?"
- "there is sudo docker compose"
- "no still the same"
- "add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git"
- "just do it" (re: git push)
- "how to make sure data in :8767 are accurate and point to archive.db"
- "I can't see older than 16th there should 21st of april. In http://[IP_ADDRESS]:8766/ I can see all but not on sqlite viewer http://[IP_ADDRESS]:8767"
- "ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive"
- [docker compose output showing orphan container error]
- "looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast"
- "lets make the playing speed more than 8x"
- "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
7. Pending Tasks:
- **Playback speed fix** (in progress, partially done):
- Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` inside `ttInner` HTML
- Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions
- Update speed select `onchange` to call `ttSetSpeed(+this.value)`
- Add 64× option to speed select
- Update `_ttMovePlayhead` to also update `ttPlayheadTime` label
- Update `ttSyncBtn` to start/stop timer based on play state + speed
- Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)
- Rebuild Docker image after changes
8. Current Work:
Working on fixing two issues with the Timetable tab:
1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.
2. **Timeline position indicator**: Playhead not prominent enough.
**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:
```css
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
```
Session was interrupted by summary request after this CSS edit, mid-implementation.
9. Optional Next Step:
Continuing the fix for: "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
The next steps in order are:
1. Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)
2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`
3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)
4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option
5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer
6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`
If you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl
Continue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with "I'll continue" or similar. Pick up the last task as if the break never happened.
Thinking
Thinking
Bash
Find timetable speed and playhead related code
IN
grep -n "tt-playhead\|ttPlayhead\|ttInner\|_ttMovePlayhead\|ttSetSpeed\|_ttStartSpeed\|_ttStopSpeed\|ttSyncBtn\|playbackRate\|speed.*select\|spdSel\|ttSpeed" /volume1/screenpipe/app/static/index.html | head -80
Copy code to clipboard
OUT
207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
580: <div class="tt-inner" id="ttInner" onclick="ttTimelineClick(event)">
583: <div class="tt-playhead" id="ttPlayhead"></div>
598: onpause="ttSyncBtn()"
599: onplay="ttSyncBtn()">
607: <select id="ttSpeed" onchange="document.getElementById('ttVideo').playbackRate=+this.value">
1624: document.getElementById('ttInner').style.width = '100%';
1632: document.getElementById('ttPlayhead').style.display = 'none';
1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';
1700: const inner = document.getElementById('ttInner');
1710: const inner = document.getElementById('ttInner');
1718: const inner = document.getElementById('ttInner');
1750: _ttMovePlayhead(new Date(best.ts).getTime());
1772: _ttMovePlayhead(new Date(best.ts).getTime());
1791:function _ttMovePlayhead(tsMs) {
1792: const ph = document.getElementById('ttPlayhead');
1802: const ph = document.getElementById('ttPlayhead');
1805: const inner = document.getElementById('ttInner');
1819:function ttSyncBtn() {
Read
index.html
index.html
(lines 576-625)
Read
index.html
index.html
(lines 1786-1865)
Thinking
Thinking
Bash
Find chunk loading and playhead update functions
IN
grep -n "ttUpdatePlayhead\|ttNextChunk\|ttLoadChunk\|_ttCurChunk\|_ttChunks\|_ttFrames" /volume1/screenpipe/app/static/index.html | head -50
Copy code to clipboard
OUT
596: onended="ttNextChunk()"
597: ontimeupdate="ttUpdatePlayhead()"
1569:let _ttFrames = [];
1570:let _ttChunks = [];
1571:let _ttCurChunk = -1;
1607: _ttFrames = data.frames;
1609: for (const f of _ttFrames) {
1613: _ttChunks = [...chunkMap.values()];
1614: _ttCurChunk = -1;
1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();
1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();
1620: for (const f of _ttFrames) _ttColor(f.app);
1640: for (const f of _ttFrames) {
1736: if (!_ttFrames.length) return;
1737: let best = _ttFrames[0], minDiff = Infinity;
1738: for (const f of _ttFrames) {
1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);
1744: _ttCurChunk = ci;
1753:function ttNextChunk() {
1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;
1755: _ttCurChunk++;
1757: video.src = _ttChunks[_ttCurChunk][0].video_url;
1762:function ttUpdatePlayhead() {
1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;
1765: const chunk = _ttChunks[_ttCurChunk];
Read
index.html
index.html
(lines 1754-1793)
Thinking
Thinking
Read
index.html
index.html
(lines 1701-1760)
Thinking
Thinking
Read
index.html
index.html
(lines 1561-1640)
Thinking
Thinking
Bash
Find time formatting functions
IN
grep -n "function fmtTime\|function fmtDate\|function _fmt\|localTimeToUtc\|fmtDateTime" /volume1/screenpipe/app/static/index.html | head -20
Copy code to clipboard
OUT
1088: if (tf) url += `&time_from=${localTimeToUtc(tf)}`;
1089: if (tt) url += `&time_to=${localTimeToUtc(tt)}`;
1153: let meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge}`;
1166: meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge} <span class="badge ${r.is_input_device?'mic':'sys'}">${r.is_input_device?'MIC':'SYS'}</span>`;
1307:function fmtTime(ts) {
1312:function fmtDateTime(ts) {
1320:function localTimeToUtc(timeStr) {
1778:function _fmtSec(s) {
1788: `${fmtDateTime(f.ts)} · ${f.app}${f.win ? ' / ' + f.win : ''}`;
Read
index.html
index.html
(lines 1308-1327)
Thinking
Thinking
Now I have everything I need. I'll implement the frame-by-frame timer system that replaces
video.playbackRate
with wall-clock accurate playback, plus add the playhead time label. Let me make the changes:
Edit
index.html
index.html
Added 1 line...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Explorer (⇧⌘E) - 1 unsaved file","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":22,"role_description":"text"},{"role":"AXRadioButton","text":"Search (⇧⌘F)","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"role_description":"text"},{"role":"AXRadioButton","text":"Source Control (⌃⇧G) - 2 pending changes","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":22,"role_description":"text"},{"role":"AXRadioButton","text":"Run and Debug (⇧⌘D)","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"role_description":"text"},{"role":"AXRadioButton","text":"Remote Explorer","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"role_description":"text"},{"role":"AXRadioButton","text":"Extensions (⇧⌘X) - 2 require update, 1 requires restart","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":22,"role_description":"text"},{"role":"AXRadioButton","text":"Claude Code","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"Containers","depth":19,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"EXPLORER","depth":17,"role_description":"heading"},{"role":"AXStaticText","text":"EXPLORER","depth":18,"role_description":"text"},{"role":"AXButton","text":"Explorer Section: screenpipe [SSH: nas]","depth":21,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXHeading","text":"Explorer Section: screenpipe [SSH: nas]","depth":22,"role_description":"heading"},{"role":"AXStaticText","text":"SCREENPIPE [SSH: NAS]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"#recycle","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"app","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"data","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"pipes","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":".gitignore","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"app_settings.json","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"archive.db","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"db.sqlite","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"screenpipe_sync.sh","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"screenpipe.db","depth":27,"role_description":"text"},{"role":"AXButton","text":"Outline Section","depth":21,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXHeading","text":"OUTLINE","depth":22,"role_description":"heading"},{"role":"AXStaticText","text":"OUTLINE","depth":23,"role_description":"text"},{"role":"AXButton","text":"Timeline Section","depth":21,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXHeading","text":"TIMELINE","depth":22,"role_description":"heading"},{"role":"AXStaticText","text":"TIMELINE","depth":23,"role_description":"text"},{"role":"AXRadioButton","text":"app_settings.json, Editor Group 1","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe_sync.sh, Editor Group 1","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":"db.sqlite-shm, preview, Editor Group 1","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","depth":28,"value":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","role_description":"editor","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","depth":29,"role_description":"text"},{"role":"AXRadioButton","text":"lets add ability to jump…, Editor Group 2","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":"Problems (⇧⌘M)","depth":22,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PROBLEMS","depth":24,"role_description":"text"},{"role":"AXRadioButton","text":"Output (⇧⌘U)","depth":22,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUTPUT","depth":24,"role_description":"text"},{"role":"AXRadioButton","text":"Debug Console (⇧⌘Y)","depth":22,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"DEBUG CONSOLE","depth":24,"role_description":"text"},{"role":"AXRadioButton","text":"Terminal (⌃`)","depth":22,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"TERMINAL","depth":24,"role_description":"text"},{"role":"AXRadioButton","text":"Ports","depth":22,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PORTS","depth":24,"role_description":"text"},{"role":"AXButton","text":"remote SSH: nas","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"SSH: nas","depth":17,"role_description":"text"},{"role":"AXButton","text":"screenpipe (Git) - master*, Checkout Branch/Tag...","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"master*","depth":17,"role_description":"text"},{"role":"AXButton","text":"screenpipe (Git) - Synchronize Changes","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"No Problems","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"role_description":"text"},{"role":"AXButton","text":"No Ports Forwarded","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"role_description":"text"},{"role":"AXButton","text":"Notifications","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Signed out","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"role_description":"text"},{"role":"AXStaticText","text":"Signed out","depth":17,"role_description":"text"},{"role":"AXButton","text":"Shell Script","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Editor Language Status: Inline Suggestions, next: $(copilot) No inline suggestion available, Inline suggestions","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"LF","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"UTF-8","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Spaces: 2","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Ln 352, Col 47 (13091 selected)","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Screen Reader Optimized","depth":16,"bounds":{"left":1.0,"top":0.0,"width":-0.0041667223,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"git-commit Lukas Kovalik (23 hours ago)","depth":16,"bounds":{"left":0.8680556,"top":0.0,"width":0.13194442,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.8715278,"top":0.0,"width":0.011111111,"height":0.017777778},"role_description":"text"},{"role":"AXStaticText","text":"Lukas Kovalik (23 hours ago)","depth":17,"bounds":{"left":0.8826389,"top":0.0,"width":0.11597222,"height":0.015555556},"role_description":"text"},{"role":"AXStaticText","text":"Info: Downloading VS Code Server...","depth":12,"role_description":"text"},{"role":"AXButton","text":"lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time","depth":19,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Session history","depth":19,"help_text":"Session history","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New session","depth":19,"help_text":"New session","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Message actions","depth":24,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.\n\nSummary:\n1. Primary Request and Intent:\n\nThe user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:\n- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.\n- **Q2**: AND combination search (term1 + term2 must both appear) → Added \"AND also\" input field.\n- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.\n- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.\n- **Q5**: \"still the same\" (container not picking up config) → Explained `up -d` vs `restart`.\n- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.\n- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.\n- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.\n- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.\n\n2. Key Technical Concepts:\n\n- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.\n- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.\n- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.\n- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.\n- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.\n- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.\n- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.\n- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.\n- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.\n- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.\n- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\\#recycle/`.\n\n3. Files and Code Sections:\n\n- **`/volume1/screenpipe/app/main.py`**\n - Added `/api/apps` endpoint (all unique app names from frames table)\n - Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)\n - `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: \"...\"}`\n - Key snippet:\n ```python","depth":26,"role_description":"text"},{"role":"AXButton","text":"@app.get(\"/api/timetable\"","depth":26,"help_text":"Open app.get(\"/api/timetable\"","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":")\n async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):\n ...\n rows = conn.execute(f\"\"\"\n SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,\n f.offset_index, f.snapshot_path,\n vc.file_path AS video_path, vc.fps AS video_fps\n FROM frames f\n JOIN video_chunks vc ON f.video_chunk_id = vc.id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND f.video_chunk_id IS NOT NULL {dev_clause}\n ORDER BY f.timestamp\n \"\"\", params).fetchall()\n # seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)\n ```\n\n- **`/volume1/screenpipe/app/docker-compose.yml`**\n - Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`\n - Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`\n - screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`\n\n- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)\n - **Search enhancements**:\n - Added `id=\"sq2\"` \"AND also\" input between search-row1 and search-row2\n - Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id=\"msOnlyApps\"`, `id=\"msSkipApps\"`)\n - Updated `buildUrl()` to combine `q + \" \" + q2` and convert times with `localTimeToUtc()`\n - Added `fmtDateTime(ts)` showing \"Apr 20 14:08\" format\n - Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC\n - Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`\n - **Timetable tab** (new page):\n - Tab button added between Work Report and AI Summary\n - `showPage` array updated: `['activity','search','audio','report','timetable','summary']`\n - `refresh()` calls `loadTimetable()` when on timetable page\n - **Timetable CSS** (key styles):\n ```css\n .tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }\n .tt-inner { position:relative; height:52px; } /* width set dynamically */\n .tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n .tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n .tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }\n .tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }\n ```\n - **Timetable JS state variables**:\n ```javascript\n let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;\n let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;\n const _ttAppColors = {};\n const TT_ZOOMS = [1, 2, 4, 8, 16, 32];\n const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};\n ```\n - **Key JS functions**:\n - `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders\n - `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead\n - `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)\n - `ttOverviewClick(e)` — scrolls timeline + seeks video\n - `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`\n - `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`\n - `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video\n - `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked\n - `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`\n - `_ttShowNow(f)` — updates screenshot thumbnail + now-text div\n - `ttSyncBtn()` — syncs play/pause button text\n - Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom\n\n- **`/volume1/screenpipe/.gitignore`**\n ```\n *.db, *.sqlite, *.sqlite-shm, *.sqlite-wal\n data/, \\#recycle/,","depth":26,"role_description":"text"},{"role":"AXButton","text":"@eaDir/","depth":26,"help_text":"Open eaDir/","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"app_settings.json, app/.env\n __pycache__/, *.pyc, .DS_Store\n ```\n\n4. Errors and Fixes:\n\n- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\\#recycle/`. Also had to `git rm --cached \"#recycle/desktop.ini\"` to unstage it.\n- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.\n- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.\n- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.\n- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.\n\n5. Problem Solving:\n\n- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.\n- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.\n- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).\n- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.\n\n6. All User Messages:\n\n- \"do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps.\"\n- \"doi I need to restart?\"\n- \"there is sudo docker compose\"\n- \"no still the same\"\n- \"add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git\"\n- \"just do it\" (re: git push)\n- \"how to make sure data in :8767 are accurate and point to archive.db\"\n- \"I can't see older than 16th there should 21st of april. In http://192.168.0.242:8766/ I can see all but not on sqlite viewer http://192.168.0.242:8767\"\n- \"ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive\"\n- [docker compose output showing orphan container error]\n- \"looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast\"\n- \"lets make the playing speed more than 8x\"\n- \"still playing speed is not showing properly still just in one second. also I want to see in timeline where I am\"\n\n7. Pending Tasks:\n\n- **Playback speed fix** (in progress, partially done):\n - Add `<div class=\"tt-playhead-time\" id=\"ttPlayheadTime\"></div>` inside `ttInner` HTML\n - Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions\n - Update speed select `onchange` to call `ttSetSpeed(+this.value)`\n - Add 64× option to speed select\n - Update `_ttMovePlayhead` to also update `ttPlayheadTime` label\n - Update `ttSyncBtn` to start/stop timer based on play state + speed\n - Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)\n - Rebuild Docker image after changes\n\n8. Current Work:\n\nWorking on fixing two issues with the Timetable tab:\n1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.\n2. **Timeline position indicator**: Playhead not prominent enough. \n\n**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:\n```css\n.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n```\n\nSession was interrupted by summary request after this CSS edit, mid-implementation.\n\n9. Optional Next Step:\n\nContinuing the fix for: \"still playing speed is not showing properly still just in one second. also I want to see in timeline where I am\"\n\nThe next steps in order are:\n1. Add `<div class=\"tt-playhead-time\" id=\"ttPlayheadTime\"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)\n2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`\n3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)\n4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option\n5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer\n6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`\n\nIf you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl\nContinue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with \"I'll continue\" or similar. Pick up the last task as if the break never happened.","depth":26,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find timetable speed and playhead related code","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"tt-playhead\\|ttPlayhead\\|ttInner\\|_ttMovePlayhead\\|ttSetSpeed\\|_ttStartSpeed\\|_ttStopSpeed\\|ttSyncBtn\\|playbackRate\\|speed.*select\\|spdSel\\|ttSpeed\" /volume1/screenpipe/app/static/index.html | head -80","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n580: <div class=\"tt-inner\" id=\"ttInner\" onclick=\"ttTimelineClick(event)\">\n583: <div class=\"tt-playhead\" id=\"ttPlayhead\"></div>\n598: onpause=\"ttSyncBtn()\"\n599: onplay=\"ttSyncBtn()\">\n607: <select id=\"ttSpeed\" onchange=\"document.getElementById('ttVideo').playbackRate=+this.value\">\n1624: document.getElementById('ttInner').style.width = '100%';\n1632: document.getElementById('ttPlayhead').style.display = 'none';\n1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';\n1700: const inner = document.getElementById('ttInner');\n1710: const inner = document.getElementById('ttInner');\n1718: const inner = document.getElementById('ttInner');\n1750: _ttMovePlayhead(new Date(best.ts).getTime());\n1772: _ttMovePlayhead(new Date(best.ts).getTime());\n1791:function _ttMovePlayhead(tsMs) {\n1792: const ph = document.getElementById('ttPlayhead');\n1802: const ph = document.getElementById('ttPlayhead');\n1805: const inner = document.getElementById('ttInner');\n1819:function ttSyncBtn() {","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 576-625)","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1786-1865)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find chunk loading and playhead update functions","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"ttUpdatePlayhead\\|ttNextChunk\\|ttLoadChunk\\|_ttCurChunk\\|_ttChunks\\|_ttFrames\" /volume1/screenpipe/app/static/index.html | head -50","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"596: onended=\"ttNextChunk()\"\n597: ontimeupdate=\"ttUpdatePlayhead()\"\n1569:let _ttFrames = [];\n1570:let _ttChunks = [];\n1571:let _ttCurChunk = -1;\n1607: _ttFrames = data.frames;\n1609: for (const f of _ttFrames) {\n1613: _ttChunks = [...chunkMap.values()];\n1614: _ttCurChunk = -1;\n1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();\n1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();\n1620: for (const f of _ttFrames) _ttColor(f.app);\n1640: for (const f of _ttFrames) {\n1736: if (!_ttFrames.length) return;\n1737: let best = _ttFrames[0], minDiff = Infinity;\n1738: for (const f of _ttFrames) {\n1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);\n1744: _ttCurChunk = ci;\n1753:function ttNextChunk() {\n1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;\n1755: _ttCurChunk++;\n1757: video.src = _ttChunks[_ttCurChunk][0].video_url;\n1762:function ttUpdatePlayhead() {\n1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;\n1765: const chunk = _ttChunks[_ttCurChunk];","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1754-1793)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1701-1760)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1561-1640)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find time formatting functions","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"function fmtTime\\|function fmtDate\\|function _fmt\\|localTimeToUtc\\|fmtDateTime\" /volume1/screenpipe/app/static/index.html | head -20","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"1088: if (tf) url += `&time_from=${localTimeToUtc(tf)}`;\n1089: if (tt) url += `&time_to=${localTimeToUtc(tt)}`;\n1153: let meta = `<span style=\"color:var(--muted)\">${fmtDateTime(r.timestamp)}</span>${srcBadge}`;\n1166: meta = `<span style=\"color:var(--muted)\">${fmtDateTime(r.timestamp)}</span>${srcBadge} <span class=\"badge ${r.is_input_device?'mic':'sys'}\">${r.is_input_device?'MIC':'SYS'}</span>`;\n1307:function fmtTime(ts) {\n1312:function fmtDateTime(ts) {\n1320:function localTimeToUtc(timeStr) {\n1778:function _fmtSec(s) {\n1788: `${fmtDateTime(f.ts)} · ${f.app}${f.win ? ' / ' + f.win : ''}`;","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1308-1327)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Now I have everything I need. I'll implement the frame-by-frame timer system that replaces","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"video.playbackRate","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"with wall-clock accurate playback, plus add the playhead time label. Let me make the changes:","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Edit","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Added 1 line","depth":24,"role_description":"text"}]...
|
-1796843030002276732
|
4474475550963076503
|
visual_change
|
accessibility
|
NULL
|
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Source Control (⌃⇧G) - 2 pending changes
2
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: nas]
Explorer Section: screenpipe [SSH: nas]
SCREENPIPE [SSH: NAS]
#recycle
app
data
pipes
.gitignore
app_settings.json
archive.db
db.sqlite
screenpipe_sync.sh
screenpipe.db
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
app_settings.json, Editor Group 1
screenpipe_sync.sh, Editor Group 1
db.sqlite-shm, preview, Editor Group 1
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lets add ability to jump…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: nas
SSH: nas
screenpipe (Git) - master*, Checkout Branch/Tag...
master*
screenpipe (Git) - Synchronize Changes
No Problems
0
0
No Ports Forwarded
0
Notifications
Signed out
Signed out
Shell Script
Editor Language Status: Inline Suggestions, next: $(copilot) No inline suggestion available, Inline suggestions
LF
UTF-8
Spaces: 2
Ln 352, Col 47 (13091 selected)
Screen Reader Optimized
git-commit Lukas Kovalik (23 hours ago)
Lukas Kovalik (23 hours ago)
Info: Downloading VS Code Server...
lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time
Session history
New session
Message actions
This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.
Summary:
1. Primary Request and Intent:
The user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:
- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.
- **Q2**: AND combination search (term1 + term2 must both appear) → Added "AND also" input field.
- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.
- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.
- **Q5**: "still the same" (container not picking up config) → Explained `up -d` vs `restart`.
- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.
- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.
- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.
- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.
2. Key Technical Concepts:
- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.
- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.
- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.
- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.
- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.
- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.
- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.
- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.
- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.
- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.
- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\#recycle/`.
3. Files and Code Sections:
- **`/volume1/screenpipe/app/main.py`**
- Added `/api/apps` endpoint (all unique app names from frames table)
- Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)
- `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: "..."}`
- Key snippet:
```python
@app.get("/api/timetable"
)
async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):
...
rows = conn.execute(f"""
SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,
f.offset_index, f.snapshot_path,
vc.file_path AS video_path, vc.fps AS video_fps
FROM frames f
JOIN video_chunks vc ON f.video_chunk_id = vc.id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND f.video_chunk_id IS NOT NULL {dev_clause}
ORDER BY f.timestamp
""", params).fetchall()
# seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)
```
- **`/volume1/screenpipe/app/docker-compose.yml`**
- Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`
- Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`
- screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`
- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)
- **Search enhancements**:
- Added `id="sq2"` "AND also" input between search-row1 and search-row2
- Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id="msOnlyApps"`, `id="msSkipApps"`)
- Updated `buildUrl()` to combine `q + " " + q2` and convert times with `localTimeToUtc()`
- Added `fmtDateTime(ts)` showing "Apr 20 14:08" format
- Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC
- Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`
- **Timetable tab** (new page):
- Tab button added between Work Report and AI Summary
- `showPage` array updated: `['activity','search','audio','report','timetable','summary']`
- `refresh()` calls `loadTimetable()` when on timetable page
- **Timetable CSS** (key styles):
```css
.tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }
.tt-inner { position:relative; height:52px; } /* width set dynamically */
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
.tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }
.tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }
```
- **Timetable JS state variables**:
```javascript
let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;
let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;
const _ttAppColors = {};
const TT_ZOOMS = [1, 2, 4, 8, 16, 32];
const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};
```
- **Key JS functions**:
- `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders
- `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead
- `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)
- `ttOverviewClick(e)` — scrolls timeline + seeks video
- `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`
- `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`
- `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video
- `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked
- `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`
- `_ttShowNow(f)` — updates screenshot thumbnail + now-text div
- `ttSyncBtn()` — syncs play/pause button text
- Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom
- **`/volume1/screenpipe/.gitignore`**
```
*.db, *.sqlite, *.sqlite-shm, *.sqlite-wal
data/, \#recycle/,
@eaDir/
app_settings.json, app/.env
__pycache__/, *.pyc, .DS_Store
```
4. Errors and Fixes:
- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\#recycle/`. Also had to `git rm --cached "#recycle/desktop.ini"` to unstage it.
- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.
- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.
- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.
- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.
5. Problem Solving:
- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.
- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.
- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).
- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.
6. All User Messages:
- "do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps."
- "doi I need to restart?"
- "there is sudo docker compose"
- "no still the same"
- "add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git"
- "just do it" (re: git push)
- "how to make sure data in :8767 are accurate and point to archive.db"
- "I can't see older than 16th there should 21st of april. In http://[IP_ADDRESS]:8766/ I can see all but not on sqlite viewer http://[IP_ADDRESS]:8767"
- "ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive"
- [docker compose output showing orphan container error]
- "looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast"
- "lets make the playing speed more than 8x"
- "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
7. Pending Tasks:
- **Playback speed fix** (in progress, partially done):
- Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` inside `ttInner` HTML
- Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions
- Update speed select `onchange` to call `ttSetSpeed(+this.value)`
- Add 64× option to speed select
- Update `_ttMovePlayhead` to also update `ttPlayheadTime` label
- Update `ttSyncBtn` to start/stop timer based on play state + speed
- Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)
- Rebuild Docker image after changes
8. Current Work:
Working on fixing two issues with the Timetable tab:
1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.
2. **Timeline position indicator**: Playhead not prominent enough.
**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:
```css
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
```
Session was interrupted by summary request after this CSS edit, mid-implementation.
9. Optional Next Step:
Continuing the fix for: "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
The next steps in order are:
1. Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)
2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`
3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)
4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option
5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer
6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`
If you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl
Continue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with "I'll continue" or similar. Pick up the last task as if the break never happened.
Thinking
Thinking
Bash
Find timetable speed and playhead related code
IN
grep -n "tt-playhead\|ttPlayhead\|ttInner\|_ttMovePlayhead\|ttSetSpeed\|_ttStartSpeed\|_ttStopSpeed\|ttSyncBtn\|playbackRate\|speed.*select\|spdSel\|ttSpeed" /volume1/screenpipe/app/static/index.html | head -80
Copy code to clipboard
OUT
207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
580: <div class="tt-inner" id="ttInner" onclick="ttTimelineClick(event)">
583: <div class="tt-playhead" id="ttPlayhead"></div>
598: onpause="ttSyncBtn()"
599: onplay="ttSyncBtn()">
607: <select id="ttSpeed" onchange="document.getElementById('ttVideo').playbackRate=+this.value">
1624: document.getElementById('ttInner').style.width = '100%';
1632: document.getElementById('ttPlayhead').style.display = 'none';
1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';
1700: const inner = document.getElementById('ttInner');
1710: const inner = document.getElementById('ttInner');
1718: const inner = document.getElementById('ttInner');
1750: _ttMovePlayhead(new Date(best.ts).getTime());
1772: _ttMovePlayhead(new Date(best.ts).getTime());
1791:function _ttMovePlayhead(tsMs) {
1792: const ph = document.getElementById('ttPlayhead');
1802: const ph = document.getElementById('ttPlayhead');
1805: const inner = document.getElementById('ttInner');
1819:function ttSyncBtn() {
Read
index.html
index.html
(lines 576-625)
Read
index.html
index.html
(lines 1786-1865)
Thinking
Thinking
Bash
Find chunk loading and playhead update functions
IN
grep -n "ttUpdatePlayhead\|ttNextChunk\|ttLoadChunk\|_ttCurChunk\|_ttChunks\|_ttFrames" /volume1/screenpipe/app/static/index.html | head -50
Copy code to clipboard
OUT
596: onended="ttNextChunk()"
597: ontimeupdate="ttUpdatePlayhead()"
1569:let _ttFrames = [];
1570:let _ttChunks = [];
1571:let _ttCurChunk = -1;
1607: _ttFrames = data.frames;
1609: for (const f of _ttFrames) {
1613: _ttChunks = [...chunkMap.values()];
1614: _ttCurChunk = -1;
1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();
1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();
1620: for (const f of _ttFrames) _ttColor(f.app);
1640: for (const f of _ttFrames) {
1736: if (!_ttFrames.length) return;
1737: let best = _ttFrames[0], minDiff = Infinity;
1738: for (const f of _ttFrames) {
1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);
1744: _ttCurChunk = ci;
1753:function ttNextChunk() {
1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;
1755: _ttCurChunk++;
1757: video.src = _ttChunks[_ttCurChunk][0].video_url;
1762:function ttUpdatePlayhead() {
1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;
1765: const chunk = _ttChunks[_ttCurChunk];
Read
index.html
index.html
(lines 1754-1793)
Thinking
Thinking
Read
index.html
index.html
(lines 1701-1760)
Thinking
Thinking
Read
index.html
index.html
(lines 1561-1640)
Thinking
Thinking
Bash
Find time formatting functions
IN
grep -n "function fmtTime\|function fmtDate\|function _fmt\|localTimeToUtc\|fmtDateTime" /volume1/screenpipe/app/static/index.html | head -20
Copy code to clipboard
OUT
1088: if (tf) url += `&time_from=${localTimeToUtc(tf)}`;
1089: if (tt) url += `&time_to=${localTimeToUtc(tt)}`;
1153: let meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge}`;
1166: meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge} <span class="badge ${r.is_input_device?'mic':'sys'}">${r.is_input_device?'MIC':'SYS'}</span>`;
1307:function fmtTime(ts) {
1312:function fmtDateTime(ts) {
1320:function localTimeToUtc(timeStr) {
1778:function _fmtSec(s) {
1788: `${fmtDateTime(f.ts)} · ${f.app}${f.win ? ' / ' + f.win : ''}`;
Read
index.html
index.html
(lines 1308-1327)
Thinking
Thinking
Now I have everything I need. I'll implement the frame-by-frame timer system that replaces
video.playbackRate
with wall-clock accurate playback, plus add the playhead time label. Let me make the changes:
Edit
index.html
index.html
Added 1 line...
|
NULL
|
NULL
|
|
81313
|
2163
|
8
|
2026-04-25T16:11:04.937214+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-25/1777 /Users/lukas/.screenpipe/data/data/2026-04-25/1777133464937_m2.jpg...
|
Code
|
screenpipe_sync.sh — screenpipe [SSH: nas]
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Source Control (⌃⇧G) - 2 pending changes
2
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: nas]
Explorer Section: screenpipe [SSH: nas]
SCREENPIPE [SSH: NAS]
#recycle
app
data
pipes
.gitignore
app_settings.json
archive.db
db.sqlite
screenpipe_sync.sh
screenpipe.db
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
app_settings.json, Editor Group 1
screenpipe_sync.sh, Editor Group 1
db.sqlite-shm, preview, Editor Group 1
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lets add ability to jump…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: nas
SSH: nas
screenpipe (Git) - master*, Checkout Branch/Tag...
master*
screenpipe (Git) - Synchronize Changes
No Problems
0
0
No Ports Forwarded
0
Notifications
Signed out
Signed out
Shell Script
Editor Language Status: Inline Suggestions, next: $(copilot) No inline suggestion available, Inline suggestions
LF
UTF-8
Spaces: 2
Ln 352, Col 47 (13091 selected)
Screen Reader Optimized
git-commit Lukas Kovalik (23 hours ago)
Lukas Kovalik (23 hours ago)
Info: Downloading VS Code Server...
lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time
Session history
New session
Message actions
This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.
Summary:
1. Primary Request and Intent:
The user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:
- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.
- **Q2**: AND combination search (term1 + term2 must both appear) → Added "AND also" input field.
- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.
- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.
- **Q5**: "still the same" (container not picking up config) → Explained `up -d` vs `restart`.
- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.
- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.
- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.
- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.
2. Key Technical Concepts:
- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.
- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.
- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.
- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.
- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.
- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.
- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.
- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.
- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.
- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.
- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\#recycle/`.
3. Files and Code Sections:
- **`/volume1/screenpipe/app/main.py`**
- Added `/api/apps` endpoint (all unique app names from frames table)
- Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)
- `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: "..."}`
- Key snippet:
```python
@app.get("/api/timetable"
)
async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):
...
rows = conn.execute(f"""
SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,
f.offset_index, f.snapshot_path,
vc.file_path AS video_path, vc.fps AS video_fps
FROM frames f
JOIN video_chunks vc ON f.video_chunk_id = vc.id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND f.video_chunk_id IS NOT NULL {dev_clause}
ORDER BY f.timestamp
""", params).fetchall()
# seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)
```
- **`/volume1/screenpipe/app/docker-compose.yml`**
- Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`
- Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`
- screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`
- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)
- **Search enhancements**:
- Added `id="sq2"` "AND also" input between search-row1 and search-row2
- Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id="msOnlyApps"`, `id="msSkipApps"`)
- Updated `buildUrl()` to combine `q + " " + q2` and convert times with `localTimeToUtc()`
- Added `fmtDateTime(ts)` showing "Apr 20 14:08" format
- Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC
- Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`
- **Timetable tab** (new page):
- Tab button added between Work Report and AI Summary
- `showPage` array updated: `['activity','search','audio','report','timetable','summary']`
- `refresh()` calls `loadTimetable()` when on timetable page
- **Timetable CSS** (key styles):
```css
.tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }
.tt-inner { position:relative; height:52px; } /* width set dynamically */
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
.tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }
.tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }
```
- **Timetable JS state variables**:
```javascript
let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;
let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;
const _ttAppColors = {};
const TT_ZOOMS = [1, 2, 4, 8, 16, 32];
const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};
```
- **Key JS functions**:
- `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders
- `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead
- `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)
- `ttOverviewClick(e)` — scrolls timeline + seeks video
- `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`
- `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`
- `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video
- `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked
- `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`
- `_ttShowNow(f)` — updates screenshot thumbnail + now-text div
- `ttSyncBtn()` — syncs play/pause button text
- Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom
- **`/volume1/screenpipe/.gitignore`**
```
*.db, *.sqlite, *.sqlite-shm, *.sqlite-wal
data/, \#recycle/,
@eaDir/
app_settings.json, app/.env
__pycache__/, *.pyc, .DS_Store
```
4. Errors and Fixes:
- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\#recycle/`. Also had to `git rm --cached "#recycle/desktop.ini"` to unstage it.
- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.
- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.
- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.
- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.
5. Problem Solving:
- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.
- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.
- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).
- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.
6. All User Messages:
- "do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps."
- "doi I need to restart?"
- "there is sudo docker compose"
- "no still the same"
- "add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git"
- "just do it" (re: git push)
- "how to make sure data in :8767 are accurate and point to archive.db"
- "I can't see older than 16th there should 21st of april. In http://[IP_ADDRESS]:8766/ I can see all but not on sqlite viewer http://[IP_ADDRESS]:8767"
- "ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive"
- [docker compose output showing orphan container error]
- "looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast"
- "lets make the playing speed more than 8x"
- "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
7. Pending Tasks:
- **Playback speed fix** (in progress, partially done):
- Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` inside `ttInner` HTML
- Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions
- Update speed select `onchange` to call `ttSetSpeed(+this.value)`
- Add 64× option to speed select
- Update `_ttMovePlayhead` to also update `ttPlayheadTime` label
- Update `ttSyncBtn` to start/stop timer based on play state + speed
- Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)
- Rebuild Docker image after changes
8. Current Work:
Working on fixing two issues with the Timetable tab:
1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.
2. **Timeline position indicator**: Playhead not prominent enough.
**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:
```css
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
```
Session was interrupted by summary request after this CSS edit, mid-implementation.
9. Optional Next Step:
Continuing the fix for: "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
The next steps in order are:
1. Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)
2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`
3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)
4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option
5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer
6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`
If you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl
Continue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with "I'll continue" or similar. Pick up the last task as if the break never happened.
Thinking
Thinking
Bash
Find timetable speed and playhead related code
IN
grep -n "tt-playhead\|ttPlayhead\|ttInner\|_ttMovePlayhead\|ttSetSpeed\|_ttStartSpeed\|_ttStopSpeed\|ttSyncBtn\|playbackRate\|speed.*select\|spdSel\|ttSpeed" /volume1/screenpipe/app/static/index.html | head -80
Copy code to clipboard
OUT
207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
580: <div class="tt-inner" id="ttInner" onclick="ttTimelineClick(event)">
583: <div class="tt-playhead" id="ttPlayhead"></div>
598: onpause="ttSyncBtn()"
599: onplay="ttSyncBtn()">
607: <select id="ttSpeed" onchange="document.getElementById('ttVideo').playbackRate=+this.value">
1624: document.getElementById('ttInner').style.width = '100%';
1632: document.getElementById('ttPlayhead').style.display = 'none';
1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';
1700: const inner = document.getElementById('ttInner');
1710: const inner = document.getElementById('ttInner');
1718: const inner = document.getElementById('ttInner');
1750: _ttMovePlayhead(new Date(best.ts).getTime());
1772: _ttMovePlayhead(new Date(best.ts).getTime());
1791:function _ttMovePlayhead(tsMs) {
1792: const ph = document.getElementById('ttPlayhead');
1802: const ph = document.getElementById('ttPlayhead');
1805: const inner = document.getElementById('ttInner');
1819:function ttSyncBtn() {
Read
index.html
index.html
(lines 576-625)
Read
index.html
index.html
(lines 1786-1865)
Thinking
Thinking
Bash
Find chunk loading and playhead update functions
IN
grep -n "ttUpdatePlayhead\|ttNextChunk\|ttLoadChunk\|_ttCurChunk\|_ttChunks\|_ttFrames" /volume1/screenpipe/app/static/index.html | head -50
Copy code to clipboard
OUT
596: onended="ttNextChunk()"
597: ontimeupdate="ttUpdatePlayhead()"
1569:let _ttFrames = [];
1570:let _ttChunks = [];
1571:let _ttCurChunk = -1;
1607: _ttFrames = data.frames;
1609: for (const f of _ttFrames) {
1613: _ttChunks = [...chunkMap.values()];
1614: _ttCurChunk = -1;
1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();
1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();
1620: for (const f of _ttFrames) _ttColor(f.app);
1640: for (const f of _ttFrames) {
1736: if (!_ttFrames.length) return;
1737: let best = _ttFrames[0], minDiff = Infinity;
1738: for (const f of _ttFrames) {
1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);
1744: _ttCurChunk = ci;
1753:function ttNextChunk() {
1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;
1755: _ttCurChunk++;
1757: video.src = _ttChunks[_ttCurChunk][0].video_url;
1762:function ttUpdatePlayhead() {
1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;
1765: const chunk = _ttChunks[_ttCurChunk];
Read
index.html
index.html
(lines 1754-1793)
Thinking
Thinking
Read
index.html
index.html
(lines 1701-1760)
Thinking
Thinking
Read
index.html
index.html
(lines 1561-1640)
Thinking
Thinking
Bash
Find time formatting functions
IN
grep -n "function fmtTime\|function fmtDate\|function _fmt\|localTimeToUtc\|fmtDateTime" /volume1/screenpipe/app/static/index.html | head -20
Copy code to clipboard
OUT
1088: if (tf) url += `&time_from=${localTimeToUtc(tf)}`;
1089: if (tt) url += `&time_to=${localTimeToUtc(tt)}`;
1153: let meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge}`;
1166: meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge} <span class="badge ${r.is_input_device?'mic':'sys'}">${r.is_input_device?'MIC':'SYS'}</span>`;
1307:function fmtTime(ts) {
1312:function fmtDateTime(ts) {
1320:function localTimeToUtc(timeStr) {
1778:function _fmtSec(s) {
1788: `${fmtDateTime(f.ts)} · ${f.app}${f.win ? ' / ' + f.win : ''}`;
Read
index.html
index.html
(lines 1308-1327)
Thinking
Thinking
Now I have everything I need. I'll implement the frame-by-frame timer system that replaces
video.playbackRate
with wall-clock accurate playback, plus add the playhead time label. Let me make the changes:
Edit
index.html
index.html
Added 1 line...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Explorer (⇧⌘E) - 1 unsaved file","depth":19,"bounds":{"left":0.0,"top":0.047885075,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.057462092,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXStaticText","text":"1","depth":22,"bounds":{"left":0.009640957,"top":0.06863528,"width":0.0016622341,"height":0.008778931},"role_description":"text"},{"role":"AXRadioButton","text":"Search (⇧⌘F)","depth":19,"bounds":{"left":0.0,"top":0.08619314,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.09577015,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXRadioButton","text":"Source Control (⌃⇧G) - 2 pending changes","depth":19,"bounds":{"left":0.0,"top":0.1245012,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.13407822,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXStaticText","text":"2","depth":22,"bounds":{"left":0.009640957,"top":0.1452514,"width":0.0019946808,"height":0.008778931},"role_description":"text"},{"role":"AXRadioButton","text":"Run and Debug (⇧⌘D)","depth":19,"bounds":{"left":0.0,"top":0.16280925,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.17238627,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXRadioButton","text":"Remote Explorer","depth":19,"bounds":{"left":0.0,"top":0.20111732,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.21069433,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXRadioButton","text":"Extensions (⇧⌘X) - 2 require update, 1 requires restart","depth":19,"bounds":{"left":0.0,"top":0.23942538,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.2490024,"width":0.007978723,"height":0.01915403},"role_description":"text"},{"role":"AXStaticText","text":"3","depth":22,"bounds":{"left":0.00930851,"top":0.2601756,"width":0.0023271276,"height":0.008778931},"role_description":"text"},{"role":"AXRadioButton","text":"Claude Code","depth":19,"bounds":{"left":0.0,"top":0.27773345,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"Containers","depth":19,"bounds":{"left":0.0,"top":0.3160415,"width":0.015957447,"height":0.03830806},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"EXPLORER","depth":17,"bounds":{"left":0.022606382,"top":0.047885075,"width":0.018949468,"height":0.02793296},"role_description":"heading"},{"role":"AXStaticText","text":"EXPLORER","depth":18,"bounds":{"left":0.022606382,"top":0.056664005,"width":0.018949468,"height":0.0103751},"role_description":"text"},{"role":"AXButton","text":"Explorer Section: screenpipe [SSH: nas]","depth":21,"bounds":{"left":0.015957447,"top":0.07581804,"width":0.09940159,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.07821229,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXHeading","text":"Explorer Section: screenpipe [SSH: nas]","depth":22,"bounds":{"left":0.022606382,"top":0.07581804,"width":0.045877658,"height":0.017557861},"role_description":"heading"},{"role":"AXStaticText","text":"SCREENPIPE [SSH: NAS]","depth":23,"bounds":{"left":0.022606382,"top":0.079010375,"width":0.045877658,"height":0.0103751},"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.09577015,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"#recycle","depth":27,"bounds":{"left":0.025930852,"top":0.09577015,"width":0.017287234,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.11332801,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"app","depth":27,"bounds":{"left":0.025930852,"top":0.11332801,"width":0.0076462766,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.10605053,"top":0.11412609,"width":0.004654255,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.13088587,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"data","depth":27,"bounds":{"left":0.025930852,"top":0.13088587,"width":0.008976064,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.14844373,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"pipes","depth":27,"bounds":{"left":0.025930852,"top":0.14844373,"width":0.010970744,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.16440542,"width":0.0063164895,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":".gitignore","depth":27,"bounds":{"left":0.025930852,"top":0.1660016,"width":0.018949468,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.1819633,"width":0.0063164895,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"app_settings.json","depth":27,"bounds":{"left":0.025930852,"top":0.18355946,"width":0.03557181,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.19952115,"width":0.0076462766,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"archive.db","depth":27,"bounds":{"left":0.025930852,"top":0.20111732,"width":0.020944148,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.21707901,"width":0.0076462766,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"db.sqlite","depth":27,"bounds":{"left":0.025930852,"top":0.21867518,"width":0.017287234,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.23463687,"width":0.0063164895,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"screenpipe_sync.sh","depth":27,"bounds":{"left":0.025930852,"top":0.23623304,"width":0.039893616,"height":0.011971269},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.01861702,"top":0.25219473,"width":0.0076462766,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"screenpipe.db","depth":27,"bounds":{"left":0.025930852,"top":0.25379092,"width":0.028590426,"height":0.011971269},"role_description":"text"},{"role":"AXButton","text":"Outline Section","depth":21,"bounds":{"left":0.015957447,"top":0.9473264,"width":0.09940159,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.9497207,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXHeading","text":"OUTLINE","depth":22,"bounds":{"left":0.022606382,"top":0.9473264,"width":0.01662234,"height":0.017557861},"role_description":"heading"},{"role":"AXStaticText","text":"OUTLINE","depth":23,"bounds":{"left":0.022606382,"top":0.95131683,"width":0.01662234,"height":0.0103751},"role_description":"text"},{"role":"AXButton","text":"Timeline Section","depth":21,"bounds":{"left":0.015957447,"top":0.9648843,"width":0.09940159,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.96727854,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXHeading","text":"TIMELINE","depth":22,"bounds":{"left":0.022606382,"top":0.9648843,"width":0.01761968,"height":0.017557861},"role_description":"heading"},{"role":"AXStaticText","text":"TIMELINE","depth":23,"bounds":{"left":0.022606382,"top":0.9688747,"width":0.01761968,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"app_settings.json, Editor Group 1","depth":28,"bounds":{"left":0.11569149,"top":0.047885075,"width":0.055851065,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe_sync.sh, Editor Group 1","depth":28,"bounds":{"left":0.17154256,"top":0.047885075,"width":0.06050532,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":"db.sqlite-shm, preview, Editor Group 1","depth":28,"bounds":{"left":0.23171543,"top":0.047885075,"width":0.04886968,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","depth":28,"bounds":{"left":0.11569149,"top":0.0933759,"width":0.38031915,"height":0.0007980846},"value":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","role_description":"editor","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"","depth":29,"bounds":{"left":0.11569149,"top":0.0933759,"width":0.35804522,"height":0.0007980846},"role_description":"text"},{"role":"AXRadioButton","text":"lets add ability to jump…, Editor Group 2","depth":28,"bounds":{"left":0.5578458,"top":0.047885075,"width":0.06948138,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":"Problems (⇧⌘M)","depth":22,"bounds":{"left":0.118351065,"top":0.59936154,"width":0.027925532,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PROBLEMS","depth":24,"bounds":{"left":0.122340426,"top":0.60814047,"width":0.019946808,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Output (⇧⌘U)","depth":22,"bounds":{"left":0.14594415,"top":0.59936154,"width":0.023603724,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUTPUT","depth":24,"bounds":{"left":0.14993352,"top":0.60814047,"width":0.015625,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Debug Console (⇧⌘Y)","depth":22,"bounds":{"left":0.16921543,"top":0.59936154,"width":0.039893616,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"DEBUG CONSOLE","depth":24,"bounds":{"left":0.1732048,"top":0.60814047,"width":0.031914894,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Terminal (⌃`)","depth":22,"bounds":{"left":0.2087766,"top":0.59936154,"width":0.026595745,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"TERMINAL","depth":24,"bounds":{"left":0.21276596,"top":0.60814047,"width":0.01861702,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Ports","depth":22,"bounds":{"left":0.23537233,"top":0.59936154,"width":0.020279255,"height":0.02793296},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PORTS","depth":24,"bounds":{"left":0.2393617,"top":0.60814047,"width":0.012300532,"height":0.0103751},"role_description":"text"},{"role":"AXButton","text":"remote SSH: nas","depth":16,"bounds":{"left":0.0006648936,"top":0.98244214,"width":0.028590426,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.0033244682,"top":0.9848364,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"SSH: nas","depth":17,"bounds":{"left":0.008643617,"top":0.9856345,"width":0.017952127,"height":0.011173184},"role_description":"text"},{"role":"AXButton","text":"screenpipe (Git) - master*, Checkout Branch/Tag...","depth":16,"bounds":{"left":0.030917553,"top":0.98244214,"width":0.023271276,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.031914894,"top":0.9848364,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"master*","depth":17,"bounds":{"left":0.03723404,"top":0.9856345,"width":0.015957447,"height":0.011173184},"role_description":"text"},{"role":"AXButton","text":"screenpipe (Git) - Synchronize Changes","depth":16,"bounds":{"left":0.05418883,"top":0.98244214,"width":0.00731383,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"No Problems","depth":16,"bounds":{"left":0.06416223,"top":0.98244214,"width":0.022606382,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.06582447,"top":0.9848364,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"bounds":{"left":0.07114362,"top":0.9856345,"width":0.004986702,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.07579787,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"bounds":{"left":0.08111702,"top":0.9856345,"width":0.0039893617,"height":0.011173184},"role_description":"text"},{"role":"AXButton","text":"No Ports Forwarded","depth":16,"bounds":{"left":0.08843085,"top":0.98244214,"width":0.012632979,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.09009308,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"bounds":{"left":0.09541223,"top":0.9856345,"width":0.0039893617,"height":0.011173184},"role_description":"text"},{"role":"AXButton","text":"Notifications","depth":16,"bounds":{"left":0.9886968,"top":0.98244214,"width":0.010638298,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Signed out","depth":16,"bounds":{"left":0.9567819,"top":0.98244214,"width":0.031914894,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.9594415,"top":0.9848364,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Signed out","depth":17,"bounds":{"left":0.96476066,"top":0.9856345,"width":0.021276595,"height":0.011173184},"role_description":"text"},{"role":"AXButton","text":"Shell Script","depth":16,"bounds":{"left":0.93151593,"top":0.98244214,"width":0.023603724,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Editor Language Status: Inline Suggestions, next: $(copilot) No inline suggestion available, Inline suggestions","depth":16,"bounds":{"left":0.92420214,"top":0.98244214,"width":0.0076462766,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"LF","depth":16,"bounds":{"left":0.91356385,"top":0.98244214,"width":0.00831117,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"UTF-8","depth":16,"bounds":{"left":0.8962766,"top":0.98244214,"width":0.015625,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Spaces: 2","depth":16,"bounds":{"left":0.87234044,"top":0.98244214,"width":0.021941489,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Ln 352, Col 47 (13091 selected)","depth":16,"bounds":{"left":0.80518615,"top":0.98244214,"width":0.065159574,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Screen Reader Optimized","depth":16,"bounds":{"left":0.75099736,"top":0.98244214,"width":0.05319149,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"git-commit Lukas Kovalik (23 hours ago)","depth":16,"bounds":{"left":0.68583775,"top":0.98244214,"width":0.06416223,"height":0.01755786},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.6875,"top":0.9848364,"width":0.005319149,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Lukas Kovalik (23 hours ago)","depth":17,"bounds":{"left":0.6928192,"top":0.9856345,"width":0.055518616,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"Info: Downloading VS Code Server...","depth":12,"role_description":"text"},{"role":"AXButton","text":"lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time","depth":19,"bounds":{"left":0.56017286,"top":0.08060654,"width":0.099734046,"height":0.022346368},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Session history","depth":19,"bounds":{"left":0.9780585,"top":0.08060654,"width":0.00930851,"height":0.022346368},"help_text":"Session history","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New session","depth":19,"bounds":{"left":0.9886968,"top":0.08060654,"width":0.00930851,"height":0.022346368},"help_text":"New session","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Message actions","depth":24,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.\n\nSummary:\n1. Primary Request and Intent:\n\nThe user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:\n- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.\n- **Q2**: AND combination search (term1 + term2 must both appear) → Added \"AND also\" input field.\n- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.\n- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.\n- **Q5**: \"still the same\" (container not picking up config) → Explained `up -d` vs `restart`.\n- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.\n- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.\n- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.\n- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.\n\n2. Key Technical Concepts:\n\n- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.\n- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.\n- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.\n- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.\n- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.\n- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.\n- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.\n- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.\n- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.\n- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.\n- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\\#recycle/`.\n\n3. Files and Code Sections:\n\n- **`/volume1/screenpipe/app/main.py`**\n - Added `/api/apps` endpoint (all unique app names from frames table)\n - Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)\n - `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: \"...\"}`\n - Key snippet:\n ```python","depth":26,"role_description":"text"},{"role":"AXButton","text":"@app.get(\"/api/timetable\"","depth":26,"help_text":"Open app.get(\"/api/timetable\"","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":")\n async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):\n ...\n rows = conn.execute(f\"\"\"\n SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,\n f.offset_index, f.snapshot_path,\n vc.file_path AS video_path, vc.fps AS video_fps\n FROM frames f\n JOIN video_chunks vc ON f.video_chunk_id = vc.id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND f.video_chunk_id IS NOT NULL {dev_clause}\n ORDER BY f.timestamp\n \"\"\", params).fetchall()\n # seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)\n ```\n\n- **`/volume1/screenpipe/app/docker-compose.yml`**\n - Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`\n - Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`\n - screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`\n\n- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)\n - **Search enhancements**:\n - Added `id=\"sq2\"` \"AND also\" input between search-row1 and search-row2\n - Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id=\"msOnlyApps\"`, `id=\"msSkipApps\"`)\n - Updated `buildUrl()` to combine `q + \" \" + q2` and convert times with `localTimeToUtc()`\n - Added `fmtDateTime(ts)` showing \"Apr 20 14:08\" format\n - Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC\n - Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`\n - **Timetable tab** (new page):\n - Tab button added between Work Report and AI Summary\n - `showPage` array updated: `['activity','search','audio','report','timetable','summary']`\n - `refresh()` calls `loadTimetable()` when on timetable page\n - **Timetable CSS** (key styles):\n ```css\n .tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }\n .tt-inner { position:relative; height:52px; } /* width set dynamically */\n .tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n .tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n .tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }\n .tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }\n ```\n - **Timetable JS state variables**:\n ```javascript\n let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;\n let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;\n const _ttAppColors = {};\n const TT_ZOOMS = [1, 2, 4, 8, 16, 32];\n const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};\n ```\n - **Key JS functions**:\n - `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders\n - `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead\n - `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)\n - `ttOverviewClick(e)` — scrolls timeline + seeks video\n - `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`\n - `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`\n - `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video\n - `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked\n - `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`\n - `_ttShowNow(f)` — updates screenshot thumbnail + now-text div\n - `ttSyncBtn()` — syncs play/pause button text\n - Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom\n\n- **`/volume1/screenpipe/.gitignore`**\n ```\n *.db, *.sqlite, *.sqlite-shm, *.sqlite-wal\n data/, \\#recycle/,","depth":26,"role_description":"text"},{"role":"AXButton","text":"@eaDir/","depth":26,"help_text":"Open eaDir/","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"app_settings.json, app/.env\n __pycache__/, *.pyc, .DS_Store\n ```\n\n4. Errors and Fixes:\n\n- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\\#recycle/`. Also had to `git rm --cached \"#recycle/desktop.ini\"` to unstage it.\n- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.\n- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.\n- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.\n- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.\n\n5. Problem Solving:\n\n- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.\n- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.\n- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).\n- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.\n\n6. All User Messages:\n\n- \"do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps.\"\n- \"doi I need to restart?\"\n- \"there is sudo docker compose\"\n- \"no still the same\"\n- \"add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git\"\n- \"just do it\" (re: git push)\n- \"how to make sure data in :8767 are accurate and point to archive.db\"\n- \"I can't see older than 16th there should 21st of april. In http://192.168.0.242:8766/ I can see all but not on sqlite viewer http://192.168.0.242:8767\"\n- \"ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive\"\n- [docker compose output showing orphan container error]\n- \"looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast\"\n- \"lets make the playing speed more than 8x\"\n- \"still playing speed is not showing properly still just in one second. also I want to see in timeline where I am\"\n\n7. Pending Tasks:\n\n- **Playback speed fix** (in progress, partially done):\n - Add `<div class=\"tt-playhead-time\" id=\"ttPlayheadTime\"></div>` inside `ttInner` HTML\n - Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions\n - Update speed select `onchange` to call `ttSetSpeed(+this.value)`\n - Add 64× option to speed select\n - Update `_ttMovePlayhead` to also update `ttPlayheadTime` label\n - Update `ttSyncBtn` to start/stop timer based on play state + speed\n - Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)\n - Rebuild Docker image after changes\n\n8. Current Work:\n\nWorking on fixing two issues with the Timetable tab:\n1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.\n2. **Timeline position indicator**: Playhead not prominent enough. \n\n**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:\n```css\n.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n```\n\nSession was interrupted by summary request after this CSS edit, mid-implementation.\n\n9. Optional Next Step:\n\nContinuing the fix for: \"still playing speed is not showing properly still just in one second. also I want to see in timeline where I am\"\n\nThe next steps in order are:\n1. Add `<div class=\"tt-playhead-time\" id=\"ttPlayheadTime\"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)\n2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`\n3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)\n4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option\n5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer\n6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`\n\nIf you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl\nContinue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with \"I'll continue\" or similar. Pick up the last task as if the break never happened.","depth":26,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find timetable speed and playhead related code","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"tt-playhead\\|ttPlayhead\\|ttInner\\|_ttMovePlayhead\\|ttSetSpeed\\|_ttStartSpeed\\|_ttStopSpeed\\|ttSyncBtn\\|playbackRate\\|speed.*select\\|spdSel\\|ttSpeed\" /volume1/screenpipe/app/static/index.html | head -80","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }\n208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }\n580: <div class=\"tt-inner\" id=\"ttInner\" onclick=\"ttTimelineClick(event)\">\n583: <div class=\"tt-playhead\" id=\"ttPlayhead\"></div>\n598: onpause=\"ttSyncBtn()\"\n599: onplay=\"ttSyncBtn()\">\n607: <select id=\"ttSpeed\" onchange=\"document.getElementById('ttVideo').playbackRate=+this.value\">\n1624: document.getElementById('ttInner').style.width = '100%';\n1632: document.getElementById('ttPlayhead').style.display = 'none';\n1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';\n1700: const inner = document.getElementById('ttInner');\n1710: const inner = document.getElementById('ttInner');\n1718: const inner = document.getElementById('ttInner');\n1750: _ttMovePlayhead(new Date(best.ts).getTime());\n1772: _ttMovePlayhead(new Date(best.ts).getTime());\n1791:function _ttMovePlayhead(tsMs) {\n1792: const ph = document.getElementById('ttPlayhead');\n1802: const ph = document.getElementById('ttPlayhead');\n1805: const inner = document.getElementById('ttInner');\n1819:function ttSyncBtn() {","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 576-625)","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1786-1865)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find chunk loading and playhead update functions","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"ttUpdatePlayhead\\|ttNextChunk\\|ttLoadChunk\\|_ttCurChunk\\|_ttChunks\\|_ttFrames\" /volume1/screenpipe/app/static/index.html | head -50","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"596: onended=\"ttNextChunk()\"\n597: ontimeupdate=\"ttUpdatePlayhead()\"\n1569:let _ttFrames = [];\n1570:let _ttChunks = [];\n1571:let _ttCurChunk = -1;\n1607: _ttFrames = data.frames;\n1609: for (const f of _ttFrames) {\n1613: _ttChunks = [...chunkMap.values()];\n1614: _ttCurChunk = -1;\n1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();\n1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();\n1620: for (const f of _ttFrames) _ttColor(f.app);\n1640: for (const f of _ttFrames) {\n1736: if (!_ttFrames.length) return;\n1737: let best = _ttFrames[0], minDiff = Infinity;\n1738: for (const f of _ttFrames) {\n1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);\n1744: _ttCurChunk = ci;\n1753:function ttNextChunk() {\n1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;\n1755: _ttCurChunk++;\n1757: video.src = _ttChunks[_ttCurChunk][0].video_url;\n1762:function ttUpdatePlayhead() {\n1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;\n1765: const chunk = _ttChunks[_ttCurChunk];","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1754-1793)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1701-1760)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1561-1640)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Find time formatting functions","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"function fmtTime\\|function fmtDate\\|function _fmt\\|localTimeToUtc\\|fmtDateTime\" /volume1/screenpipe/app/static/index.html | head -20","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"1088: if (tf) url += `&time_from=${localTimeToUtc(tf)}`;\n1089: if (tt) url += `&time_to=${localTimeToUtc(tt)}`;\n1153: let meta = `<span style=\"color:var(--muted)\">${fmtDateTime(r.timestamp)}</span>${srcBadge}`;\n1166: meta = `<span style=\"color:var(--muted)\">${fmtDateTime(r.timestamp)}</span>${srcBadge} <span class=\"badge ${r.is_input_device?'mic':'sys'}\">${r.is_input_device?'MIC':'SYS'}</span>`;\n1307:function fmtTime(ts) {\n1312:function fmtDateTime(ts) {\n1320:function localTimeToUtc(timeStr) {\n1778:function _fmtSec(s) {\n1788: `${fmtDateTime(f.ts)} · ${f.app}${f.win ? ' / ' + f.win : ''}`;","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"(lines 1308-1327)","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Now I have everything I need. I'll implement the frame-by-frame timer system that replaces","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"video.playbackRate","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"with wall-clock accurate playback, plus add the playhead time label. Let me make the changes:","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Edit","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Added 1 line","depth":24,"role_description":"text"}]...
|
-1796843030002276732
|
4474475550963076503
|
visual_change
|
accessibility
|
NULL
|
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Source Control (⌃⇧G) - 2 pending changes
2
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: nas]
Explorer Section: screenpipe [SSH: nas]
SCREENPIPE [SSH: NAS]
#recycle
app
data
pipes
.gitignore
app_settings.json
archive.db
db.sqlite
screenpipe_sync.sh
screenpipe.db
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
app_settings.json, Editor Group 1
screenpipe_sync.sh, Editor Group 1
db.sqlite-shm, preview, Editor Group 1
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lets add ability to jump…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: nas
SSH: nas
screenpipe (Git) - master*, Checkout Branch/Tag...
master*
screenpipe (Git) - Synchronize Changes
No Problems
0
0
No Ports Forwarded
0
Notifications
Signed out
Signed out
Shell Script
Editor Language Status: Inline Suggestions, next: $(copilot) No inline suggestion available, Inline suggestions
LF
UTF-8
Spaces: 2
Ln 352, Col 47 (13091 selected)
Screen Reader Optimized
git-commit Lukas Kovalik (23 hours ago)
Lukas Kovalik (23 hours ago)
Info: Downloading VS Code Server...
lets add ability to jump fro,m search to timeline so we can see the exact screen (also based on monitor and time
Session history
New session
Message actions
This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.
Summary:
1. Primary Request and Intent:
The user has been developing a Screenpipe dashboard on a Synology NAS. Requests in chronological order:
- **Q1**: Are db.sqlite-shm and db.sqlite-wal used? → Explained WAL mode; cleaned up files.
- **Q2**: AND combination search (term1 + term2 must both appear) → Added "AND also" input field.
- **Q3**: Explain UTC time issue, show date in results, make Only/Skip apps use multiselect → Implemented all three.
- **Q4**: Point sqlite-web at archive.db, add second sqlite-web for db.sqlite → Updated docker-compose.yml, added two services on ports 8767/8768.
- **Q5**: "still the same" (container not picking up config) → Explained `up -d` vs `restart`.
- **Q6**: Add git, push to gitea.com/lakylak/screenpipe.git → Initialized repo, committed, pushed.
- **Q7**: Add Timetable tab with video playback and timeline → Full implementation with click-to-seek, auto-advancing chunks, legend.
- **Q8**: Add scroll/zoom on timeline, jump to specific time, better awareness → Implemented zoom (1×–32×), scrollable timeline, overview minimap, viewport indicator, Jump-to-time input, screenshot thumbnail.
- **Q9 (most recent)**: Make playing speed more than 8×, fix speed not working, show position on timeline → CSS fix done (wider playhead + time label style), remainder in progress.
2. Key Technical Concepts:
- **SQLite WAL mode**: db.sqlite-shm and db.sqlite-wal are WAL companion files; cleaned with `PRAGMA wal_checkpoint(TRUNCATE)`.
- **SQLite FTS5**: Space-separated terms = AND; `MATCH 'term1 term2'` requires both; OR requires explicit `OR` keyword.
- **FastAPI**: Python backend with route handlers in main.py, consumers pattern for DB queries.
- **Docker Compose**: App image is built (code baked in), not volume-mounted → requires `build` + `up -d` for code changes. `restart` doesn't re-read compose file — need `up -d`.
- **sqlite-web**: Read-only flag `-r`, pre-built image, no rebuild needed for config changes.
- **Video playback**: screenpipe records at 0.1–0.3 fps (timelapse). `seek = offset_index / fps` gives seconds into video chunk. ~245 chunks/day across 2 monitors. Videos may be encoded at standard fps making them very short at native speed.
- **Timeline rendering**: App-colored segments built by merging consecutive frames with same `app_name`. Percentage positions: `((ts - dayStart) / span * 100)%`.
- **Zoom/scroll**: Inner div width = `zoom × 100%`, outer wrapper has `overflow-x:auto`. Playhead position stays as % of inner div, which is correct at all zoom levels.
- **Timer-based speed**: For speed > 2×, browser `playbackRate` is unreliable on low-FPS video; correct approach is `setInterval` advancing `video.currentTime` by `speed * interval_ms / 1000` seconds per tick.
- **UTC vs local time**: Backend treats `time_from`/`time_to` as UTC. Frontend converts with `localTimeToUtc()` before sending.
- **Git**: `#recycle/` in .gitignore treated as comment — must escape as `\#recycle/`.
3. Files and Code Sections:
- **`/volume1/screenpipe/app/main.py`**
- Added `/api/apps` endpoint (all unique app names from frames table)
- Added `/api/timetable` endpoint (frames + video URLs + screenshot URLs per device per date)
- `/api/timetable` response structure: `{frames: [{ts, app, win, video_url, seek, screenshot_url}], devices: [...], device: "..."}`
- Key snippet:
```python
@app.get("/api/timetable"
)
async def timetable_data(d: str | None = Query(None), device: str | None = Query(None)):
...
rows = conn.execute(f"""
SELECT f.timestamp AS ts, f.app_name AS app, f.window_name AS win,
f.offset_index, f.snapshot_path,
vc.file_path AS video_path, vc.fps AS video_fps
FROM frames f
JOIN video_chunks vc ON f.video_chunk_id = vc.id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND f.video_chunk_id IS NOT NULL {dev_clause}
ORDER BY f.timestamp
""", params).fetchall()
# seek = offset_index / fps, screenshot_url from _snapshot_to_url(snapshot_path)
```
- **`/volume1/screenpipe/app/docker-compose.yml`**
- Changed sqlite-web service name to `sqlite-web-archive` → port 8767 → `/data/archive.db`
- Added `sqlite-web-live` → port 8768 → `/data/db.sqlite`
- screenpipe-app: port 8766, `DB_PATH: /data/db.sqlite`, `TZ: Europe/Sofia`
- **`/volume1/screenpipe/app/static/index.html`** (single large file with all CSS/HTML/JS)
- **Search enhancements**:
- Added `id="sq2"` "AND also" input between search-row1 and search-row2
- Replaced `sOnlyApps`/`sSkipApps` text inputs with custom multiselect components (`id="msOnlyApps"`, `id="msSkipApps"`)
- Updated `buildUrl()` to combine `q + " " + q2` and convert times with `localTimeToUtc()`
- Added `fmtDateTime(ts)` showing "Apr 20 14:08" format
- Added `localTimeToUtc(timeStr)` converting local HH:MM to UTC
- Multiselect state: `const _msState = { msOnlyApps: new Set(), msSkipApps: new Set() }`
- **Timetable tab** (new page):
- Tab button added between Work Report and AI Summary
- `showPage` array updated: `['activity','search','audio','report','timetable','summary']`
- `refresh()` calls `loadTimetable()` when on timetable page
- **Timetable CSS** (key styles):
```css
.tt-scroll-wrap { overflow-x:auto; ... scrollbar-width:thin; }
.tt-inner { position:relative; height:52px; } /* width set dynamically */
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
.tt-overview-wrap { position:relative; height:14px; ... cursor:pointer; }
.tt-overview-vp { position:absolute; background:rgba(255,255,255,0.12); border:1px solid rgba(255,255,255,0.4); }
```
- **Timetable JS state variables**:
```javascript
let _ttFrames = [], _ttChunks = [], _ttCurChunk = -1;
let _ttDayStart = 0, _ttDayEnd = 0, _ttZoom = 1;
const _ttAppColors = {};
const TT_ZOOMS = [1, 2, 4, 8, 16, 32];
const TT_TICK_MIN = {1:30, 2:15, 4:10, 8:5, 16:2, 32:1};
```
- **Key JS functions**:
- `loadTimetable()` — fetches `/api/timetable`, groups chunks, renders
- `ttZoom(dir)` — changes zoom level, updates inner width, re-renders ticks, scrolls to playhead
- `ttTimelineClick(e)` — uses `inner.getBoundingClientRect()` (works correctly when scrolled)
- `ttOverviewClick(e)` — scrolls timeline + seeks video
- `ttUpdateOverviewVp()` — updates white viewport rect using `wrap.scrollLeft / inner.scrollWidth`
- `ttJumpToTime()` — parses time input, converts to ms, calls `ttSeekToMs`
- `ttSeekToMs(tsMs)` — binary-searches nearest frame, loads chunk, seeks video
- `_ttScrollToPlayhead(force)` — scrolls wrap so playhead stays at ~35% from left when Follow is checked
- `_ttMovePlayhead(tsMs)` — sets `ph.style.left` as percentage, calls `_ttScrollToPlayhead`
- `_ttShowNow(f)` — updates screenshot thumbnail + now-text div
- `ttSyncBtn()` — syncs play/pause button text
- Keyboard: Space=play/pause, ←/→=±10s, Ctrl+←/→=±30s, +/-=zoom
- **`/volume1/screenpipe/.gitignore`**
```
*.db, *.sqlite, *.sqlite-shm, *.sqlite-wal
data/, \#recycle/,
@eaDir/
app_settings.json, app/.env
__pycache__/, *.pyc, .DS_Store
```
4. Errors and Fixes:
- **`#recycle/` in .gitignore treated as comment**: `#` starts a comment in .gitignore. Fixed by escaping: `\#recycle/`. Also had to `git rm --cached "#recycle/desktop.ini"` to unstage it.
- **`sudo docker compose restart sqlite-web` didn't apply config change**: `restart` reuses existing container config, doesn't re-read compose file. Fix: `sudo docker compose up -d` recreates containers with new config.
- **Orphan container holding port 8767**: Old `screenpipe-sqlweb` container still running after rename. Fix: `sudo docker compose up -d --remove-orphans`.
- **`sudo docker` not accessible from Claude Code**: Interactive sudo required. User runs commands in NAS terminal.
- **`git config --global --add safe.directory /volume1/screenpipe`**: Required due to dubious ownership of NAS volume directory.
5. Problem Solving:
- **Time zone confusion in search**: Backend uses UTC for time_from/time_to; frontend displays local time. Solved by `localTimeToUtc()` converting before API call, and showing date+time in results.
- **sqlite-web not showing April 17–21 data**: Container was pointing at db.sqlite (old config), not archive.db. Fixed by updating docker-compose.yml + `up -d`.
- **Video playback speed**: Browser `video.playbackRate` is capped (~16× max in Chrome) and performs poorly for very low FPS (0.1–0.3 fps) screenpipe videos. Each chunk may only be 1–2 seconds of wall-clock encoded video, playing through instantly. Solution: implement timer-based frame-jumping for speed > 2× (in progress).
- **Playhead visibility**: White 2px line was hard to see. Fixed CSS to 3px width + stronger box-shadow + added `.tt-playhead-time` overlay label style.
6. All User Messages:
- "do we use db.sqlite-shm and db.sqlite-wal for anything right now? [image of search UI] Lets add ability to search with combination... Explain how does the search work time seems to work in utc maybe display date next to the time in results. Make only apps and skip apps multiselect with all available apps."
- "doi I need to restart?"
- "there is sudo docker compose"
- "no still the same"
- "add git. I have created gitea repo https://gitea.com/lakylak/screenpipe.git"
- "just do it" (re: git push)
- "how to make sure data in :8767 are accurate and point to archive.db"
- "I can't see older than 16th there should 21st of april. In http://[IP_ADDRESS]:8766/ I can see all but not on sqlite viewer http://[IP_ADDRESS]:8767"
- "ok lets add additional port to read db.sqlite, I would like to see the structure of official db that reads db.sqlite db and one for archive"
- [docker compose output showing orphan container error]
- "looks great. I want to have ability to scroll left and right and also to jump to specific time. I want to be more aware to what I see. Still it should be fast"
- "lets make the playing speed more than 8x"
- "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
7. Pending Tasks:
- **Playback speed fix** (in progress, partially done):
- Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` inside `ttInner` HTML
- Implement `_ttStartSpeedTimer(speed)` / `_ttStopSpeedTimer()` / `ttSetSpeed(speed)` functions
- Update speed select `onchange` to call `ttSetSpeed(+this.value)`
- Add 64× option to speed select
- Update `_ttMovePlayhead` to also update `ttPlayheadTime` label
- Update `ttSyncBtn` to start/stop timer based on play state + speed
- Update `ttNextChunk` and `ttSeekToMs` to stop timer (restarted by onplay → ttSyncBtn)
- Rebuild Docker image after changes
8. Current Work:
Working on fixing two issues with the Timetable tab:
1. **Playback speed**: `video.playbackRate` doesn't work well for low-FPS screenpipe videos. The plan is to implement a `setInterval`-based frame-jumper for speed > 2× that advances `video.currentTime` by `speed * intervalMs / 1000` every 100–200ms, bypassing browser playbackRate limits.
2. **Timeline position indicator**: Playhead not prominent enough.
**CSS already changed** in `/volume1/screenpipe/app/static/index.html`:
```css
.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
```
Session was interrupted by summary request after this CSS edit, mid-implementation.
9. Optional Next Step:
Continuing the fix for: "still playing speed is not showing properly still just in one second. also I want to see in timeline where I am"
The next steps in order are:
1. Add `<div class="tt-playhead-time" id="ttPlayheadTime"></div>` to the HTML inside `#ttInner` (after the existing `.tt-playhead` div)
2. Update `_ttMovePlayhead` to set `ttPlayheadTime` position and text content with `fmtTime()`
3. Add timer-based speed system to JS (new functions `_ttStartSpeedTimer`, `_ttStopSpeedTimer`, `ttSetSpeed`)
4. Update speed select's `onchange` to `ttSetSpeed(+this.value)` and add 64× option
5. Update `ttSyncBtn`, `ttNextChunk`, `ttSeekToMs` to integrate with timer
6. Rebuild: `sudo docker compose build screenpipe-app && sudo docker compose up -d screenpipe-app`
If you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /home/Adm1n/.claude/projects/-volume1-screenpipe/7777f46e-1e40-4051-b4bb-f43aedd59556.jsonl
Continue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with "I'll continue" or similar. Pick up the last task as if the break never happened.
Thinking
Thinking
Bash
Find timetable speed and playhead related code
IN
grep -n "tt-playhead\|ttPlayhead\|ttInner\|_ttMovePlayhead\|ttSetSpeed\|_ttStartSpeed\|_ttStopSpeed\|ttSyncBtn\|playbackRate\|speed.*select\|spdSel\|ttSpeed" /volume1/screenpipe/app/static/index.html | head -80
Copy code to clipboard
OUT
207:.tt-playhead { position:absolute; top:0; width:3px; height:36px; background:white; box-shadow:0 0 8px rgba(255,255,255,.9); z-index:10; pointer-events:none; display:none; }
208:.tt-playhead-time { position:absolute; top:2px; font-size:9px; font-weight:600; color:white; background:rgba(0,0,0,.75); padding:1px 4px; border-radius:2px; white-space:nowrap; transform:translateX(-50%); z-index:12; pointer-events:none; display:none; }
580: <div class="tt-inner" id="ttInner" onclick="ttTimelineClick(event)">
583: <div class="tt-playhead" id="ttPlayhead"></div>
598: onpause="ttSyncBtn()"
599: onplay="ttSyncBtn()">
607: <select id="ttSpeed" onchange="document.getElementById('ttVideo').playbackRate=+this.value">
1624: document.getElementById('ttInner').style.width = '100%';
1632: document.getElementById('ttPlayhead').style.display = 'none';
1694: document.getElementById('ttInner').style.width = (_ttZoom * 100) + '%';
1700: const inner = document.getElementById('ttInner');
1710: const inner = document.getElementById('ttInner');
1718: const inner = document.getElementById('ttInner');
1750: _ttMovePlayhead(new Date(best.ts).getTime());
1772: _ttMovePlayhead(new Date(best.ts).getTime());
1791:function _ttMovePlayhead(tsMs) {
1792: const ph = document.getElementById('ttPlayhead');
1802: const ph = document.getElementById('ttPlayhead');
1805: const inner = document.getElementById('ttInner');
1819:function ttSyncBtn() {
Read
index.html
index.html
(lines 576-625)
Read
index.html
index.html
(lines 1786-1865)
Thinking
Thinking
Bash
Find chunk loading and playhead update functions
IN
grep -n "ttUpdatePlayhead\|ttNextChunk\|ttLoadChunk\|_ttCurChunk\|_ttChunks\|_ttFrames" /volume1/screenpipe/app/static/index.html | head -50
Copy code to clipboard
OUT
596: onended="ttNextChunk()"
597: ontimeupdate="ttUpdatePlayhead()"
1569:let _ttFrames = [];
1570:let _ttChunks = [];
1571:let _ttCurChunk = -1;
1607: _ttFrames = data.frames;
1609: for (const f of _ttFrames) {
1613: _ttChunks = [...chunkMap.values()];
1614: _ttCurChunk = -1;
1616: _ttDayStart = new Date(_ttFrames[0].ts).getTime();
1617: _ttDayEnd = new Date(_ttFrames[_ttFrames.length - 1].ts).getTime();
1620: for (const f of _ttFrames) _ttColor(f.app);
1640: for (const f of _ttFrames) {
1736: if (!_ttFrames.length) return;
1737: let best = _ttFrames[0], minDiff = Infinity;
1738: for (const f of _ttFrames) {
1742: const ci = _ttChunks.findIndex(ch => ch[0].video_url === best.video_url);
1744: _ttCurChunk = ci;
1753:function ttNextChunk() {
1754: if (_ttCurChunk + 1 >= _ttChunks.length) return;
1755: _ttCurChunk++;
1757: video.src = _ttChunks[_ttCurChunk][0].video_url;
1762:function ttUpdatePlayhead() {
1764: if (_ttCurChunk < 0 || _ttCurChunk >= _ttChunks.length) return;
1765: const chunk = _ttChunks[_ttCurChunk];
Read
index.html
index.html
(lines 1754-1793)
Thinking
Thinking
Read
index.html
index.html
(lines 1701-1760)
Thinking
Thinking
Read
index.html
index.html
(lines 1561-1640)
Thinking
Thinking
Bash
Find time formatting functions
IN
grep -n "function fmtTime\|function fmtDate\|function _fmt\|localTimeToUtc\|fmtDateTime" /volume1/screenpipe/app/static/index.html | head -20
Copy code to clipboard
OUT
1088: if (tf) url += `&time_from=${localTimeToUtc(tf)}`;
1089: if (tt) url += `&time_to=${localTimeToUtc(tt)}`;
1153: let meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge}`;
1166: meta = `<span style="color:var(--muted)">${fmtDateTime(r.timestamp)}</span>${srcBadge} <span class="badge ${r.is_input_device?'mic':'sys'}">${r.is_input_device?'MIC':'SYS'}</span>`;
1307:function fmtTime(ts) {
1312:function fmtDateTime(ts) {
1320:function localTimeToUtc(timeStr) {
1778:function _fmtSec(s) {
1788: `${fmtDateTime(f.ts)} · ${f.app}${f.win ? ' / ' + f.win : ''}`;
Read
index.html
index.html
(lines 1308-1327)
Thinking
Thinking
Now I have everything I need. I'll implement the frame-by-frame timer system that replaces
video.playbackRate
with wall-clock accurate playback, plus add the playhead time label. Let me make the changes:
Edit
index.html
index.html
Added 1 line...
|
81311
|
NULL
|
|
52968
|
1149
|
23
|
2026-04-20T07:50:45.304563+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776671445304_m2.jpg...
|
Firefox
|
sentry - Google Search — Work
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
[JY-20543] AJ Reports > Tracking - Jira
[JY-20543] AJ Reports > Tracking - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
New Tab
New Tab
Product Growth Platform | Userpilot
Product Growth Platform | Userpilot
Userpilot | Events
Userpilot | Events
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
sentry - Google Search
sentry - Google Search
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Close bookmarks (⌘B)
Bookmarks
Bookmarks
Close sidebar
Search bookmarks
Skip to main content
Skip to main content
Accessibility help
Accessibility help
Accessibility feedback
Accessibility feedback
Go to Google Home
sentry
sentry
Clear
Search by voice
Search by image
Search
Google apps
Google Account: [EMAIL]
AI Mode
AI Mode
All
All
Images
Images
Videos
Videos
News
News
Forums
Forums
Short videos
Short videos
More filters
More
Tools
Tools
Search Results
Search Results
Sponsored result
Sponsored result
Resolve Application Errors - Unite Metrics, Traces, & Logs Datadog https://www.datadoghq.com › error-tracking › alternative
Resolve Application Errors - Unite Metrics, Traces, & Logs
Resolve Application Errors - Unite Metrics, Traces, & Logs
Datadog
https://www.datadoghq.com › error-tracking › alternative
Why this ad?
Visualize The Distribution Of Errors Across All Tags To Understand The Source Of The Issue. Track...
Datadog Free Trial Sign Up Today For A Free Trial And See Value Immediately.
Datadog Free Trial
Sign Up Today For A Free Trial And See Value Immediately.
Dynamic Monitoring Multidimensional Monitoring Built For Dynamic & Hybrid Architectures.
Dynamic Monitoring
Multidimensional Monitoring Built For Dynamic & Hybrid Architectures.
Logging Without Limits Manage All Logs Cost-Effectively & Only Pay To Index The Logs You Need
Logging Without Limits
Manage All Logs Cost-Effectively & Only Pay To Index The Logs You Need
1,000+ Integrations Datadog Offers And Supports Wide Coverage Across Any Technology.
1,000+ Integrations
Datadog Offers And Supports Wide Coverage Across Any Technology.
Unified Observability See Metrics, Traces, Logs, And More In A Single Pane View.
Unified Observability
See Metrics, Traces, Logs, And More In A Single Pane View.
Hide sponsored result
Hide sponsored result
Sentry
Sentry
Sentry
Comic book character
More options for Sentry
Image of Sentry | Marvel Cinematic Universe Wiki | Fandom
Image of Sentry (Robert Reynolds) - Wikipedia
Image of How do you all feel about the Sentry as a character? Is he ...
The Sentry and The Void are respectively a superhero and supervillain appearing in American comic books published by Marvel Comics. Created by Paul Jenkins and Jae Lee, with uncredited conceptual contributions by Rick Veitch, the characters first appeared in The Sentry #1.
Source:
Wikipedia
Wikipedia
Movie More info about this Thunderbolts*2025
Movie
Thunderbolts*
2025
Played by More info about this Lewis PullmanThunderbolts*
Played by
Lewis Pullman
Thunderbolts*
Web results
Web results
Sentry: Application Performance Monitoring & Error Tracking ... Sentry https://sentry.io › ...
Sentry: Application Performance Monitoring & Error Tracking ...
Sentry: Application Performance Monitoring & Error Tracking ...
Sentry
https://sentry.io
› ...
About this result
Application performance monitoring
for developers & software teams to see errors clearer, solve issues faster & continue learning continuously.
Dictionary
Dictionary
Definitions from
Oxford Languages
Oxford Languages
Learn more
Learn more
Listen
sentry
/
ˈsɛntri
/
noun
noun
:
sentry
;
plural noun
:
sentries
a soldier
stationed
stationed
to keep guard or to control access to a place.
"sentries patrolled the border"
Similar:
guard
guard
sentinel
sentinel
lookout
lookout
watch
watch
watchman
watchman
patrol
patrol
picket
picket
vedette
vedette
Phrases
Phrases
stand sentry
stand sentry
—
keep guard or control access to a place.
Origin
Origin
early 17th century: perhaps from obsolete
centrinel
, variant of
sentinel
sentinel
.
Use over time for: sentry
Use over time for: sentry
Feedback
Feedback
See more
See more
Creators
Paul Jenkins
Paul Jenkins
,
Jae Lee
Jae Lee
,
Rick Veitch
Rick Veitch
Fictional universe
Marvel Universe
Marvel Universe
Notable aliases
Bob, Golden Guardian of Good, Golden Man
·
See more
See more
Powers and abilities
Flight
Flight
,
Superhuman strength
Superhuman strength
,
Immortality
Immortality
·
See more
See more
Species
Human
Human
People also ask
People also ask
Is the Sentry good or evil?
Is the Sentry good or evil?
What does "sentry" mean?
What does "sentry" mean?
What exactly is Sentry in Marvel?
What exactly is Sentry in Marvel?
What does a Sentry do?
What does a Sentry do?
Web results
Web results
Sentry (Robert Reynolds) Wikipedia https://en.wikipedia.org › wiki › Sentry_(Robert_Reyno...
Sentry (Robert Reynolds)
Sentry (Robert Reynolds)
Wikipedia
https://en.wikipedia.org
› wiki › Sentry_(Robert_Reyno...
About this result
The Sentry (Robert "Bob" Reynolds) and The Void are respectively
a superhero and supervillain
appearing in American comic books published by Marvel Comics.
SENTRY Definition & Meaning Merriam-Webster https://www.merriam-webster.com › dictionary › sentry
SENTRY Definition & Meaning
SENTRY Definition & Meaning
Merriam-Webster
https://www.merriam-webster.com
› dictionary › sentry
About this result
Apr 6, 2026
—
The meaning of SENTRY is
guard, watch; especially
: a soldier standing guard at a point of passage (such as a gate). How to use sentry in a ...
Sentry | Marvel Cinematic Universe Wiki - Fandom Marvel Cinematic Universe Wiki https://marvelcinematicuniverse.fandom.com › wiki › Se...
Sentry | Marvel Cinematic Universe Wiki - Fandom
Sentry | Marvel Cinematic Universe Wiki - Fandom
Marvel Cinematic Universe Wiki
https://marvelcinematicuniverse.fandom.com
› wiki › Se...
About this result
Robert "Bob" Reynolds
is a former meth addict who took part in Project Sentry, an operation by O.X.E. designed to create the ultimate superhero.
Sentry Docs | Application Performance Monitoring & Error ... Sentry Docs https://docs.sentry.io
Sentry Docs | Application Performance Monitoring & Error ...
Sentry Docs | Application Performance Monitoring & Error ...
Sentry Docs
https://docs.sentry.io
About this result
Sentry
provides end-to-end distributed tracing, enabling developers to identify and debug performance issues and errors across their systems and services.
Sentry (Robert Reynolds) Powers, Enemies, History Marvel.com https://www.marvel.com › characters › sentry-robert-re...
Sentry (Robert Reynolds) Powers, Enemies, History
Sentry (Robert Reynolds) Powers, Enemies, History
Marvel.com
https://www.marvel.com
› characters › sentry-robert-re...
About this result
The Sentry possesses remarkable levels of
superhuman strength, speed, and intelligence
, as well as invulnerability, enhanced senses, energy-projection ...
getsentry/sentry: Developer-first error tracking and ... GitHub https://github.com › getsentry › sentry
getsentry/sentry: Developer-first error tracking and ...
getsentry/sentry: Developer-first error tracking and ...
GitHub
https://github.com
› getsentry › sentry
About this result
Sentry
is the debugging platform that helps every developer detect, trace, and fix issues. Code breaks, fix it faster.
The Sentry: Home thesentry.org https://thesentry.org
The Sentry: Home
The Sentry: Home
thesentry.org
https://thesentry.org
About this result
The Sentry is
an investigative and policy organization
that seeks to disable multinational predatory networks that benefit from violent conflict, repression, ...
Sign up for Sentry to start your free trial. Sentry https://sentry.io › signup
Sign up for Sentry to start your free trial.
Sign up for Sentry to start your free trial.
Sentry
https://sentry.io
› signup
About this result
Debug any software issue
, onboard your team, and integrate with your systems. You get 14 days free on our Business plan to start — no credit card required.
Who is Sentry? : r/superheroes Reddit · r/superheroes 30+ comments · 11 months ago
Who is Sentry? : r/superheroes
Who is Sentry? : r/superheroes
Reddit · r/superheroes
30+ comments · 11 months ago
About this result
Sentry is a deeply traumatized man with severe psychological issues
. That's why he has an alternate personality called the Void, an evil force that takes ...
Sponsored result
Sponsored result
Resolve Application Errors | Visualize Key Metrics Datadog https://www.datadoghq.com › error-tracking › alternative
Resolve Application Errors | Visualize Key Metrics
Resolve Application Errors | Visualize Key Metrics
Datadog
https://www.datadoghq.com › error-tracking › alternative
Why this ad?
Visualize The Distribution Of Errors Across All Tags To Understand The Source Of The Issue. Track...
Datadog Free Trial
Datadog Free Trial...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"bounds":{"left":0.0018284575,"top":0.0518755,"width":0.07596409,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":4,"bounds":{"left":0.0,"top":0.09497207,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.10614525,"width":0.09524601,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.12769353,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.13886672,"width":0.19963431,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.16041501,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.17158818,"width":0.15525267,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20543] AJ Reports > Tracking - Jira","depth":4,"bounds":{"left":0.0,"top":0.19313647,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20543] AJ Reports > Tracking - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.20430966,"width":0.06981383,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira","depth":4,"bounds":{"left":0.0,"top":0.22585794,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.23703113,"width":0.10688165,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.2585794,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.2697526,"width":0.12915559,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"bounds":{"left":0.0,"top":0.29130086,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"bounds":{"left":0.013297873,"top":0.30247405,"width":0.014960106,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Product Growth Platform | Userpilot","depth":4,"bounds":{"left":0.0,"top":0.32402235,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Product Growth Platform | Userpilot","depth":5,"bounds":{"left":0.013297873,"top":0.33519554,"width":0.06200133,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Userpilot | Events","depth":4,"bounds":{"left":0.0,"top":0.3567438,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Userpilot | Events","depth":5,"bounds":{"left":0.013297873,"top":0.367917,"width":0.030418882,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.38946527,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.40063846,"width":0.2052859,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.42218676,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipelines - jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.43335995,"width":0.039228722,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"sentry - Google Search","depth":4,"bounds":{"left":0.0,"top":0.45490822,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"sentry - Google Search","depth":5,"bounds":{"left":0.013297873,"top":0.4660814,"width":0.040226065,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.06732048,"top":0.46209097,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.0028257978,"top":0.48922586,"width":0.07413564,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.0028257978,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.013796543,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.024933511,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.036070477,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Close bookmarks (⌘B)","depth":6,"bounds":{"left":0.04720745,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Bookmarks","depth":5,"bounds":{"left":0.083277926,"top":0.06943336,"width":0.026761968,"height":0.014764565},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Bookmarks","depth":6,"bounds":{"left":0.083277926,"top":0.06943336,"width":0.026761968,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close sidebar","depth":6,"bounds":{"left":0.1783577,"top":0.06424581,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXTextField","text":"Search bookmarks","depth":7,"bounds":{"left":0.082446806,"top":0.09976058,"width":0.107546546,"height":0.025538707},"help_text":"","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Skip to main content","depth":7,"bounds":{"left":0.19913563,"top":0.0981644,"width":0.03656915,"height":0.035115723},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to main content","depth":8,"bounds":{"left":0.20462102,"top":0.101356745,"width":0.025598405,"height":0.028731046},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Accessibility help","depth":7,"bounds":{"left":0.19913563,"top":0.0981644,"width":0.03656915,"height":0.035115723},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Accessibility help","depth":8,"bounds":{"left":0.20478724,"top":0.101356745,"width":0.025265958,"height":0.028731046},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Accessibility feedback","depth":7,"bounds":{"left":0.19913563,"top":0.12051077,"width":0.03656915,"height":0.035115723},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Accessibility feedback","depth":8,"bounds":{"left":0.20478724,"top":0.123703115,"width":0.025265958,"height":0.028731046},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Go to Google Home","depth":10,"bounds":{"left":0.2200798,"top":0.08060654,"width":0.030585106,"height":0.026336791},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXComboBox","text":"sentry","depth":9,"bounds":{"left":0.27227393,"top":0.07342378,"width":0.21875,"height":0.03990423},"value":"sentry","help_text":"","role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"sentry","depth":10,"bounds":{"left":0.27227393,"top":0.08539505,"width":0.015292553,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Clear","depth":9,"bounds":{"left":0.49102393,"top":0.07342378,"width":0.015957447,"height":0.03990423},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Search by voice","depth":9,"bounds":{"left":0.5086436,"top":0.083798885,"width":0.013297873,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Search by image","depth":9,"bounds":{"left":0.5219415,"top":0.083798885,"width":0.013297873,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Search","depth":9,"bounds":{"left":0.5365692,"top":0.07342378,"width":0.01462766,"height":0.03990423},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Google apps","depth":9,"bounds":{"left":0.96426195,"top":0.07741421,"width":0.013297873,"height":0.031923383},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"Google Account: lukas.kovalik@jiminny.com","depth":8,"bounds":{"left":0.9802194,"top":0.07741421,"width":0.013297873,"height":0.031923383},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"AI Mode","depth":14,"bounds":{"left":0.2679521,"top":0.12210695,"width":0.025930852,"height":0.03830806},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"AI Mode","depth":16,"bounds":{"left":0.27194148,"top":0.13647246,"width":0.017952127,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"All","depth":14,"bounds":{"left":0.29388297,"top":0.12210695,"width":0.013464096,"height":0.03830806},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":false,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"All","depth":17,"bounds":{"left":0.29787233,"top":0.13647246,"width":0.005485372,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Images","depth":14,"bounds":{"left":0.3073471,"top":0.12210695,"width":0.023769947,"height":0.03830806},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Images","depth":16,"bounds":{"left":0.31133643,"top":0.13647246,"width":0.015791224,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Videos","depth":14,"bounds":{"left":0.33111703,"top":0.12210695,"width":0.022772606,"height":0.03830806},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Videos","depth":16,"bounds":{"left":0.33510637,"top":0.13647246,"width":0.014793883,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"News","depth":14,"bounds":{"left":0.3538896,"top":0.12210695,"width":0.019946808,"height":0.03830806},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"News","depth":16,"bounds":{"left":0.35787898,"top":0.13647246,"width":0.011968086,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Forums","depth":14,"bounds":{"left":0.37383643,"top":0.12210695,"width":0.024102394,"height":0.03830806},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Forums","depth":16,"bounds":{"left":0.3778258,"top":0.13647246,"width":0.016123671,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Short videos","depth":14,"bounds":{"left":0.39793882,"top":0.12210695,"width":0.035738032,"height":0.03830806},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Short videos","depth":16,"bounds":{"left":0.4019282,"top":0.13647246,"width":0.027759308,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"More filters","depth":14,"bounds":{"left":0.43367687,"top":0.12210695,"width":0.025099734,"height":0.03830806},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More","depth":17,"bounds":{"left":0.43766624,"top":0.13647246,"width":0.011136968,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Tools","depth":13,"bounds":{"left":0.4587766,"top":0.12210695,"width":0.02543218,"height":0.03830806},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Tools","depth":15,"bounds":{"left":0.46276596,"top":0.13647246,"width":0.011469414,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Search Results","depth":8,"bounds":{"left":0.19547872,"top":0.16041501,"width":0.0003324468,"height":0.0007980846},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Search Results","depth":9,"bounds":{"left":0.19547872,"top":0.16041501,"width":0.03158245,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Sponsored result","depth":16,"bounds":{"left":0.27194148,"top":0.1963288,"width":0.055851065,"height":0.022346368},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sponsored result","depth":17,"bounds":{"left":0.27194148,"top":0.1963288,"width":0.055851065,"height":0.022346368},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Resolve Application Errors - Unite Metrics, Traces, & Logs Datadog https://www.datadoghq.com › error-tracking › alternative","depth":16,"bounds":{"left":0.27194148,"top":0.2849162,"width":0.16871676,"height":0.012769354},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Resolve Application Errors - Unite Metrics, Traces, & Logs","depth":17,"bounds":{"left":0.27194148,"top":0.27613726,"width":0.16871676,"height":0.023942538},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Resolve Application Errors - Unite Metrics, Traces, & Logs","depth":18,"bounds":{"left":0.27194148,"top":0.27972865,"width":0.16871676,"height":0.020351157},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Datadog","depth":21,"bounds":{"left":0.28523937,"top":0.24581006,"width":0.01761968,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"https://www.datadoghq.com › error-tracking › alternative","depth":20,"bounds":{"left":0.28523937,"top":0.26256984,"width":0.09823803,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Why this ad?","depth":17,"bounds":{"left":0.38613698,"top":0.2601756,"width":0.005984043,"height":0.017557861},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Visualize The Distribution Of Errors Across All Tags To Understand The Source Of The Issue. Track...","depth":16,"bounds":{"left":0.27194148,"top":0.3048683,"width":0.20844415,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Datadog Free Trial Sign Up Today For A Free Trial And See Value Immediately.","depth":17,"bounds":{"left":0.27726063,"top":0.34477255,"width":0.1888298,"height":0.03830806},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Datadog Free Trial","depth":19,"bounds":{"left":0.27726063,"top":0.34596968,"width":0.048537236,"height":0.018355945},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sign Up Today For A Free Trial And See Value Immediately.","depth":19,"bounds":{"left":0.27726063,"top":0.367917,"width":0.12333777,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Dynamic Monitoring Multidimensional Monitoring Built For Dynamic & Hybrid Architectures.","depth":18,"bounds":{"left":0.27726063,"top":0.40303272,"width":0.1888298,"height":0.03830806},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Dynamic Monitoring","depth":20,"bounds":{"left":0.27726063,"top":0.40422985,"width":0.05435505,"height":0.018355945},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Multidimensional Monitoring Built For Dynamic & Hybrid Architectures.","depth":20,"bounds":{"left":0.27726063,"top":0.42617717,"width":0.14461437,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Logging Without Limits Manage All Logs Cost-Effectively & Only Pay To Index The Logs You Need","depth":18,"bounds":{"left":0.27726063,"top":0.4612929,"width":0.1888298,"height":0.03830806},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Logging Without Limits","depth":20,"bounds":{"left":0.27726063,"top":0.46249002,"width":0.06200133,"height":0.018355945},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Manage All Logs Cost-Effectively & Only Pay To Index The Logs You Need","depth":20,"bounds":{"left":0.27726063,"top":0.48443735,"width":0.15392287,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"1,000+ Integrations Datadog Offers And Supports Wide Coverage Across Any Technology.","depth":18,"bounds":{"left":0.27726063,"top":0.51955307,"width":0.1888298,"height":0.03830806},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"1,000+ Integrations","depth":20,"bounds":{"left":0.27726063,"top":0.5207502,"width":0.05219415,"height":0.018355945},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Datadog Offers And Supports Wide Coverage Across Any Technology.","depth":20,"bounds":{"left":0.27726063,"top":0.54269755,"width":0.14494681,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Unified Observability See Metrics, Traces, Logs, And More In A Single Pane View.","depth":18,"bounds":{"left":0.27726063,"top":0.57781327,"width":0.1888298,"height":0.03830806},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Unified Observability","depth":20,"bounds":{"left":0.27726063,"top":0.57901037,"width":0.05651596,"height":0.018355945},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"See Metrics, Traces, Logs, And More In A Single Pane View.","depth":20,"bounds":{"left":0.27726063,"top":0.6009577,"width":0.12483378,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Hide sponsored result","depth":13,"bounds":{"left":0.27194148,"top":0.65363127,"width":0.21675532,"height":0.044692736},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Hide sponsored result","depth":16,"bounds":{"left":0.3515625,"top":0.6624102,"width":0.048204787,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Sentry","depth":15,"bounds":{"left":0.51396275,"top":0.17956904,"width":0.028424202,"height":0.028731046},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Sentry","depth":16,"bounds":{"left":0.51396275,"top":0.17956904,"width":0.028424202,"height":0.028731046},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sentry","depth":17,"bounds":{"left":0.51396275,"top":0.17956904,"width":0.028424202,"height":0.028731046},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Comic book character","depth":16,"bounds":{"left":0.51396275,"top":0.2122905,"width":0.045212764,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"More options for Sentry","depth":18,"bounds":{"left":0.5611702,"top":0.20909816,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Image of Sentry | Marvel Cinematic Universe Wiki | Fandom","depth":23,"bounds":{"left":0.51396275,"top":0.24181964,"width":0.06981383,"height":0.1915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Image of Sentry (Robert Reynolds) - Wikipedia","depth":23,"bounds":{"left":0.5844415,"top":0.24181964,"width":0.05319149,"height":0.09497207},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Image of How do you all feel about the Sentry as a character? Is he ...","depth":23,"bounds":{"left":0.5844415,"top":0.33838788,"width":0.05319149,"height":0.09497207},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"The Sentry and The Void are respectively a superhero and supervillain appearing in American comic books published by Marvel Comics. Created by Paul Jenkins and Jae Lee, with uncredited conceptual contributions by Rick Veitch, the characters first appeared in The Sentry #1.","depth":20,"bounds":{"left":0.51396275,"top":0.4445331,"width":0.12250665,"height":0.08499601},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Source:","depth":21,"bounds":{"left":0.51396275,"top":0.5482841,"width":0.016123671,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Wikipedia","depth":21,"bounds":{"left":0.53008646,"top":0.5482841,"width":0.021609042,"height":0.014764565},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Wikipedia","depth":23,"bounds":{"left":0.53125,"top":0.5482841,"width":0.02044548,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Movie More info about this Thunderbolts*2025","depth":19,"bounds":{"left":0.51396275,"top":0.5738228,"width":0.059840426,"height":0.08499601},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Movie","depth":23,"bounds":{"left":0.51795214,"top":0.584996,"width":0.013131649,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Thunderbolts*","depth":24,"bounds":{"left":0.51795214,"top":0.6097366,"width":0.04288564,"height":0.020351157},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2025","depth":24,"bounds":{"left":0.51795214,"top":0.6340782,"width":0.010638298,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Played by More info about this Lewis PullmanThunderbolts*","depth":19,"bounds":{"left":0.5777925,"top":0.5738228,"width":0.059840426,"height":0.08499601},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Played by","depth":23,"bounds":{"left":0.5817819,"top":0.584996,"width":0.021276595,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Lewis Pullman","depth":24,"bounds":{"left":0.5817819,"top":0.6097366,"width":0.041722074,"height":0.020351157},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Thunderbolts*","depth":24,"bounds":{"left":0.5817819,"top":0.6340782,"width":0.030585106,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Web results","depth":15,"bounds":{"left":0.27194148,"top":0.7186752,"width":0.0003324468,"height":0.0007980846},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Web results","depth":16,"bounds":{"left":0.27194148,"top":0.7178771,"width":0.03939495,"height":0.01915403},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Sentry: Application Performance Monitoring & Error Tracking ... Sentry https://sentry.io › ...","depth":16,"bounds":{"left":0.27194148,"top":0.7102953,"width":0.18550532,"height":0.039505187},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Sentry: Application Performance Monitoring & Error Tracking ...","depth":17,"bounds":{"left":0.27194148,"top":0.7350359,"width":0.18550532,"height":0.024740623},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sentry: Application Performance Monitoring & Error Tracking ...","depth":18,"bounds":{"left":0.27194148,"top":0.73942536,"width":0.18550532,"height":0.020351157},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sentry","depth":21,"bounds":{"left":0.28523937,"top":0.70630485,"width":0.013464096,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"https://sentry.io","depth":21,"bounds":{"left":0.28523937,"top":0.72226655,"width":0.026761968,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"› ...","depth":22,"bounds":{"left":0.31200132,"top":0.72226655,"width":0.0068151597,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"About this result","depth":16,"bounds":{"left":0.32147607,"top":0.71907425,"width":0.00930851,"height":0.015961692},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Application performance monitoring","depth":17,"bounds":{"left":0.27194148,"top":0.76456505,"width":0.08045213,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"for developers & software teams to see errors clearer, solve issues faster & continue learning continuously.","depth":16,"bounds":{"left":0.27194148,"top":0.76456505,"width":0.2044548,"height":0.030327214},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Dictionary","depth":16,"bounds":{"left":0.27194148,"top":0.8308061,"width":0.03374335,"height":0.022346368},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Dictionary","depth":18,"bounds":{"left":0.27194148,"top":0.8308061,"width":0.03374335,"height":0.022346368},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Definitions from","depth":17,"bounds":{"left":0.27194148,"top":0.8603352,"width":0.028756648,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Oxford Languages","depth":17,"bounds":{"left":0.30069813,"top":0.8603352,"width":0.032912236,"height":0.011173184},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Oxford Languages","depth":18,"bounds":{"left":0.30069813,"top":0.8603352,"width":0.032912236,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Learn more","depth":17,"bounds":{"left":0.33710107,"top":0.8603352,"width":0.02044548,"height":0.011173184},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Learn more","depth":18,"bounds":{"left":0.33710107,"top":0.8603352,"width":0.02044548,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Listen","depth":16,"bounds":{"left":0.2699468,"top":0.8898643,"width":0.015957447,"height":0.03830806},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sentry","depth":18,"bounds":{"left":0.28789893,"top":0.8882682,"width":0.02642952,"height":0.028731046},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":18,"bounds":{"left":0.28789893,"top":0.91779727,"width":0.0011635638,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ˈsɛntri","depth":18,"bounds":{"left":0.2890625,"top":0.91779727,"width":0.010638298,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":18,"bounds":{"left":0.2997008,"top":0.91779727,"width":0.0011635638,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"noun","depth":17,"bounds":{"left":0.27194148,"top":0.94493216,"width":0.010305851,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"noun","depth":17,"bounds":{"left":0.27194148,"top":0.96249,"width":0.010305851,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":17,"bounds":{"left":0.28224733,"top":0.9612929,"width":0.0029920214,"height":0.014365523},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"sentry","depth":17,"bounds":{"left":0.28523937,"top":0.96249,"width":0.013962766,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":";","depth":17,"bounds":{"left":0.2992021,"top":0.9612929,"width":0.0029920214,"height":0.014365523},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"plural noun","depth":17,"bounds":{"left":0.30219415,"top":0.96249,"width":0.022938829,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":17,"bounds":{"left":0.32513297,"top":0.9612929,"width":0.0029920214,"height":0.014365523},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"sentries","depth":17,"bounds":{"left":0.328125,"top":0.96249,"width":0.017952127,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"a soldier","depth":19,"bounds":{"left":0.27726063,"top":0.9680766,"width":0.021941489,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"stationed","depth":19,"bounds":{"left":0.2992021,"top":0.9680766,"width":0.022772606,"height":0.016360734},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"stationed","depth":20,"bounds":{"left":0.2992021,"top":0.9680766,"width":0.022772606,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"to keep guard or to control access to a place.","depth":19,"bounds":{"left":0.32197472,"top":0.9680766,"width":0.110538565,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"sentries patrolled the border\"","depth":21,"bounds":{"left":0.27726063,"top":0.9896249,"width":0.061170213,"height":0.0103750825},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Similar:","depth":21,"bounds":{"left":0.27726063,"top":1.0,"width":0.015458777,"height":-0.021548271},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"guard","depth":21,"bounds":{"left":0.29537898,"top":1.0,"width":0.020944148,"height":-0.01516366},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"guard","depth":22,"bounds":{"left":0.30069813,"top":1.0,"width":0.010305851,"height":-0.022346377},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"sentinel","depth":21,"bounds":{"left":0.31898272,"top":1.0,"width":0.024268618,"height":-0.01516366},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sentinel","depth":22,"bounds":{"left":0.32430187,"top":1.0,"width":0.013630319,"height":-0.022346377},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"lookout","depth":21,"bounds":{"left":0.3459109,"top":1.0,"width":0.023603724,"height":-0.01516366},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"lookout","depth":22,"bounds":{"left":0.35123006,"top":1.0,"width":0.012965426,"height":-0.022346377},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"watch","depth":21,"bounds":{"left":0.3721742,"top":1.0,"width":0.020944148,"height":-0.01516366},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"watch","depth":22,"bounds":{"left":0.37749335,"top":1.0,"width":0.010305851,"height":-0.022346377},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"watchman","depth":21,"bounds":{"left":0.3957779,"top":1.0,"width":0.028922873,"height":-0.01516366},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"watchman","depth":22,"bounds":{"left":0.4010971,"top":1.0,"width":0.018284574,"height":-0.022346377},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"patrol","depth":21,"bounds":{"left":0.4273604,"top":1.0,"width":0.020611702,"height":-0.01516366},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"patrol","depth":22,"bounds":{"left":0.43267953,"top":1.0,"width":0.009973404,"height":-0.022346377},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"picket","depth":21,"bounds":{"left":0.45063165,"top":1.0,"width":0.020944148,"height":-0.01516366},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"picket","depth":22,"bounds":{"left":0.4559508,"top":1.0,"width":0.010305851,"height":-0.022346377},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"vedette","depth":21,"bounds":{"left":0.27726063,"top":1.0,"width":0.023769947,"height":-0.055067778},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"vedette","depth":22,"bounds":{"left":0.28257978,"top":1.0,"width":0.013131649,"height":-0.062250614},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Phrases","depth":17,"bounds":{"left":0.27194148,"top":1.0,"width":0.21675532,"height":-0.042298436},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Phrases","depth":18,"bounds":{"left":0.27194148,"top":1.0,"width":0.021276595,"height":-0.0618515},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"stand sentry","depth":19,"bounds":{"left":0.27194148,"top":1.0,"width":0.025265958,"height":-0.086193085},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"stand sentry","depth":20,"bounds":{"left":0.27194148,"top":1.0,"width":0.025265958,"height":-0.086193085},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"—","depth":19,"bounds":{"left":0.29720744,"top":1.0,"width":0.00831117,"height":-0.084995985},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"keep guard or control access to a place.","depth":19,"bounds":{"left":0.30551863,"top":1.0,"width":0.08261303,"height":-0.086193085},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Origin","depth":18,"bounds":{"left":0.27194148,"top":1.0,"width":0.21675532,"height":-0.058260202},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Origin","depth":19,"bounds":{"left":0.27194148,"top":1.0,"width":0.016788565,"height":-0.058659196},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"early 17th century: perhaps from obsolete","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"centrinel","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":", variant of","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"sentinel","depth":19,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sentinel","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Use over time for: sentry","depth":17,"bounds":{"left":0.27194148,"top":1.0,"width":0.21675532,"height":-0.066241026},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Use over time for: sentry","depth":18,"bounds":{"left":0.27194148,"top":1.0,"width":0.065990694,"height":-0.06664002},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Feedback","depth":15,"bounds":{"left":0.47124335,"top":1.0,"width":0.017453458,"height":-0.06304872},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Feedback","depth":17,"bounds":{"left":0.47124335,"top":1.0,"width":0.017453458,"height":-0.06304872},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"See more","depth":16,"bounds":{"left":0.31848404,"top":1.0,"width":0.12367021,"height":-0.07302475},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"See more","depth":18,"bounds":{"left":0.36535904,"top":1.0,"width":0.020611702,"height":-0.081404686},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Creators","depth":20,"bounds":{"left":0.51795214,"top":0.7218675,"width":0.018949468,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Paul Jenkins","depth":21,"bounds":{"left":0.55668217,"top":0.7186752,"width":0.025764627,"height":0.021149242},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Paul Jenkins","depth":22,"bounds":{"left":0.55668217,"top":0.7218675,"width":0.025764627,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":",","depth":21,"bounds":{"left":0.5824468,"top":0.7218675,"width":0.0021609042,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Jae Lee","depth":21,"bounds":{"left":0.5846077,"top":0.7186752,"width":0.01662234,"height":0.021149242},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jae Lee","depth":22,"bounds":{"left":0.5846077,"top":0.7218675,"width":0.01662234,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":",","depth":21,"bounds":{"left":0.60123,"top":0.7218675,"width":0.002493351,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Rick Veitch","depth":21,"bounds":{"left":0.6037234,"top":0.7186752,"width":0.022772606,"height":0.021149242},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Rick Veitch","depth":22,"bounds":{"left":0.6037234,"top":0.7218675,"width":0.022772606,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Fictional universe","depth":20,"bounds":{"left":0.51795214,"top":0.7601756,"width":0.01861702,"height":0.032322425},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Marvel Universe","depth":21,"bounds":{"left":0.55668217,"top":0.7569832,"width":0.03357713,"height":0.021149242},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Marvel Universe","depth":22,"bounds":{"left":0.55668217,"top":0.7601756,"width":0.03357713,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Notable aliases","depth":20,"bounds":{"left":0.51795214,"top":0.8160415,"width":0.033410903,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Bob, Golden Guardian of Good, Golden Man","depth":21,"bounds":{"left":0.55668217,"top":0.8160415,"width":0.06582447,"height":0.032322425},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":21,"bounds":{"left":0.58211434,"top":0.8335994,"width":0.0034906915,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"See more","depth":21,"bounds":{"left":0.585605,"top":0.830407,"width":0.020113032,"height":0.021149242},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"See more","depth":23,"bounds":{"left":0.585605,"top":0.8335994,"width":0.020113032,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Powers and abilities","depth":20,"bounds":{"left":0.51795214,"top":0.8719074,"width":0.025265958,"height":0.032322425},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Flight","depth":21,"bounds":{"left":0.55668217,"top":0.8687151,"width":0.011635638,"height":0.021149242},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Flight","depth":22,"bounds":{"left":0.55668217,"top":0.8719074,"width":0.011635638,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":",","depth":21,"bounds":{"left":0.56831783,"top":0.8719074,"width":0.0023271276,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Superhuman strength","depth":21,"bounds":{"left":0.570645,"top":0.8687151,"width":0.046043884,"height":0.021149242},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Superhuman strength","depth":22,"bounds":{"left":0.570645,"top":0.8719074,"width":0.046043884,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":",","depth":21,"bounds":{"left":0.61668885,"top":0.8719074,"width":0.0011635638,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Immortality","depth":21,"bounds":{"left":0.55668217,"top":0.88627297,"width":0.023936171,"height":0.021149242},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Immortality","depth":22,"bounds":{"left":0.55668217,"top":0.8894653,"width":0.023936171,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":21,"bounds":{"left":0.5806183,"top":0.8894653,"width":0.0034906915,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"See more","depth":21,"bounds":{"left":0.58410907,"top":0.88627297,"width":0.020113032,"height":0.021149242},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"See more","depth":23,"bounds":{"left":0.58410907,"top":0.8894653,"width":0.020113032,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Species","depth":20,"bounds":{"left":0.51795214,"top":0.92777336,"width":0.017287234,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Human","depth":21,"bounds":{"left":0.55668217,"top":0.924581,"width":0.014960106,"height":0.021149242},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Human","depth":22,"bounds":{"left":0.55668217,"top":0.92777336,"width":0.014960106,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"People also ask","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"People also ask","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Is the Sentry good or evil?","depth":18,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Is the Sentry good or evil?","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"What does \"sentry\" mean?","depth":18,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"What does \"sentry\" mean?","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"What exactly is Sentry in Marvel?","depth":18,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"What exactly is Sentry in Marvel?","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"What does a Sentry do?","depth":18,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"What does a Sentry do?","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Web results","depth":13,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Web results","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Sentry (Robert Reynolds) Wikipedia https://en.wikipedia.org › wiki › Sentry_(Robert_Reyno...","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Sentry (Robert Reynolds)","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sentry (Robert Reynolds)","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Wikipedia","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"https://en.wikipedia.org","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"› wiki › Sentry_(Robert_Reyno...","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"About this result","depth":14,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"The Sentry (Robert \"Bob\" Reynolds) and The Void are respectively","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"a superhero and supervillain","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"appearing in American comic books published by Marvel Comics.","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"SENTRY Definition & Meaning Merriam-Webster https://www.merriam-webster.com › dictionary › sentry","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"SENTRY Definition & Meaning","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"SENTRY Definition & Meaning","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Merriam-Webster","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"https://www.merriam-webster.com","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"› dictionary › sentry","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"About this result","depth":14,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Apr 6, 2026","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"—","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"The meaning of SENTRY is","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"guard, watch; especially","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": a soldier standing guard at a point of passage (such as a gate). How to use sentry in a ...","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Sentry | Marvel Cinematic Universe Wiki - Fandom Marvel Cinematic Universe Wiki https://marvelcinematicuniverse.fandom.com › wiki › Se...","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Sentry | Marvel Cinematic Universe Wiki - Fandom","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sentry | Marvel Cinematic Universe Wiki - Fandom","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Marvel Cinematic Universe Wiki","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"https://marvelcinematicuniverse.fandom.com","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"› wiki › Se...","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"About this result","depth":14,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Robert \"Bob\" Reynolds","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"is a former meth addict who took part in Project Sentry, an operation by O.X.E. designed to create the ultimate superhero.","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Sentry Docs | Application Performance Monitoring & Error ... Sentry Docs https://docs.sentry.io","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Sentry Docs | Application Performance Monitoring & Error ...","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sentry Docs | Application Performance Monitoring & Error ...","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sentry Docs","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"https://docs.sentry.io","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"About this result","depth":14,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Sentry","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"provides end-to-end distributed tracing, enabling developers to identify and debug performance issues and errors across their systems and services.","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Sentry (Robert Reynolds) Powers, Enemies, History Marvel.com https://www.marvel.com › characters › sentry-robert-re...","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Sentry (Robert Reynolds) Powers, Enemies, History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sentry (Robert Reynolds) Powers, Enemies, History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Marvel.com","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"https://www.marvel.com","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"› characters › sentry-robert-re...","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"About this result","depth":14,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"The Sentry possesses remarkable levels of","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"superhuman strength, speed, and intelligence","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":", as well as invulnerability, enhanced senses, energy-projection ...","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"getsentry/sentry: Developer-first error tracking and ... GitHub https://github.com › getsentry › sentry","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"getsentry/sentry: Developer-first error tracking and ...","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"getsentry/sentry: Developer-first error tracking and ...","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"GitHub","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"https://github.com","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"› getsentry › sentry","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"About this result","depth":14,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Sentry","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"is the debugging platform that helps every developer detect, trace, and fix issues. Code breaks, fix it faster.","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"The Sentry: Home thesentry.org https://thesentry.org","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"The Sentry: Home","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"The Sentry: Home","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"thesentry.org","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"https://thesentry.org","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"About this result","depth":14,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"The Sentry is","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"an investigative and policy organization","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"that seeks to disable multinational predatory networks that benefit from violent conflict, repression, ...","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Sign up for Sentry to start your free trial. Sentry https://sentry.io › signup","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Sign up for Sentry to start your free trial.","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sign up for Sentry to start your free trial.","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sentry","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"https://sentry.io","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"› signup","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"About this result","depth":14,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Debug any software issue","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":", onboard your team, and integrate with your systems. You get 14 days free on our Business plan to start — no credit card required.","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Who is Sentry? : r/superheroes Reddit · r/superheroes 30+ comments · 11 months ago","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Who is Sentry? : r/superheroes","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Who is Sentry? : r/superheroes","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Reddit · r/superheroes","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"30+ comments · 11 months ago","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"About this result","depth":14,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Sentry is a deeply traumatized man with severe psychological issues","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":". That's why he has an alternate personality called the Void, an evil force that takes ...","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Sponsored result","depth":19,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sponsored result","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Resolve Application Errors | Visualize Key Metrics Datadog https://www.datadoghq.com › error-tracking › alternative","depth":19,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Resolve Application Errors | Visualize Key Metrics","depth":20,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Resolve Application Errors | Visualize Key Metrics","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Datadog","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"https://www.datadoghq.com › error-tracking › alternative","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Why this ad?","depth":20,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Visualize The Distribution Of Errors Across All Tags To Understand The Source Of The Issue. Track...","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Datadog Free Trial","depth":19,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Datadog Free Trial","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
6342883777591427777
|
-279995548303597393
|
visual_change
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
[JY-20543] AJ Reports > Tracking - Jira
[JY-20543] AJ Reports > Tracking - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
New Tab
New Tab
Product Growth Platform | Userpilot
Product Growth Platform | Userpilot
Userpilot | Events
Userpilot | Events
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
sentry - Google Search
sentry - Google Search
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Close bookmarks (⌘B)
Bookmarks
Bookmarks
Close sidebar
Search bookmarks
Skip to main content
Skip to main content
Accessibility help
Accessibility help
Accessibility feedback
Accessibility feedback
Go to Google Home
sentry
sentry
Clear
Search by voice
Search by image
Search
Google apps
Google Account: [EMAIL]
AI Mode
AI Mode
All
All
Images
Images
Videos
Videos
News
News
Forums
Forums
Short videos
Short videos
More filters
More
Tools
Tools
Search Results
Search Results
Sponsored result
Sponsored result
Resolve Application Errors - Unite Metrics, Traces, & Logs Datadog https://www.datadoghq.com › error-tracking › alternative
Resolve Application Errors - Unite Metrics, Traces, & Logs
Resolve Application Errors - Unite Metrics, Traces, & Logs
Datadog
https://www.datadoghq.com › error-tracking › alternative
Why this ad?
Visualize The Distribution Of Errors Across All Tags To Understand The Source Of The Issue. Track...
Datadog Free Trial Sign Up Today For A Free Trial And See Value Immediately.
Datadog Free Trial
Sign Up Today For A Free Trial And See Value Immediately.
Dynamic Monitoring Multidimensional Monitoring Built For Dynamic & Hybrid Architectures.
Dynamic Monitoring
Multidimensional Monitoring Built For Dynamic & Hybrid Architectures.
Logging Without Limits Manage All Logs Cost-Effectively & Only Pay To Index The Logs You Need
Logging Without Limits
Manage All Logs Cost-Effectively & Only Pay To Index The Logs You Need
1,000+ Integrations Datadog Offers And Supports Wide Coverage Across Any Technology.
1,000+ Integrations
Datadog Offers And Supports Wide Coverage Across Any Technology.
Unified Observability See Metrics, Traces, Logs, And More In A Single Pane View.
Unified Observability
See Metrics, Traces, Logs, And More In A Single Pane View.
Hide sponsored result
Hide sponsored result
Sentry
Sentry
Sentry
Comic book character
More options for Sentry
Image of Sentry | Marvel Cinematic Universe Wiki | Fandom
Image of Sentry (Robert Reynolds) - Wikipedia
Image of How do you all feel about the Sentry as a character? Is he ...
The Sentry and The Void are respectively a superhero and supervillain appearing in American comic books published by Marvel Comics. Created by Paul Jenkins and Jae Lee, with uncredited conceptual contributions by Rick Veitch, the characters first appeared in The Sentry #1.
Source:
Wikipedia
Wikipedia
Movie More info about this Thunderbolts*2025
Movie
Thunderbolts*
2025
Played by More info about this Lewis PullmanThunderbolts*
Played by
Lewis Pullman
Thunderbolts*
Web results
Web results
Sentry: Application Performance Monitoring & Error Tracking ... Sentry https://sentry.io › ...
Sentry: Application Performance Monitoring & Error Tracking ...
Sentry: Application Performance Monitoring & Error Tracking ...
Sentry
https://sentry.io
› ...
About this result
Application performance monitoring
for developers & software teams to see errors clearer, solve issues faster & continue learning continuously.
Dictionary
Dictionary
Definitions from
Oxford Languages
Oxford Languages
Learn more
Learn more
Listen
sentry
/
ˈsɛntri
/
noun
noun
:
sentry
;
plural noun
:
sentries
a soldier
stationed
stationed
to keep guard or to control access to a place.
"sentries patrolled the border"
Similar:
guard
guard
sentinel
sentinel
lookout
lookout
watch
watch
watchman
watchman
patrol
patrol
picket
picket
vedette
vedette
Phrases
Phrases
stand sentry
stand sentry
—
keep guard or control access to a place.
Origin
Origin
early 17th century: perhaps from obsolete
centrinel
, variant of
sentinel
sentinel
.
Use over time for: sentry
Use over time for: sentry
Feedback
Feedback
See more
See more
Creators
Paul Jenkins
Paul Jenkins
,
Jae Lee
Jae Lee
,
Rick Veitch
Rick Veitch
Fictional universe
Marvel Universe
Marvel Universe
Notable aliases
Bob, Golden Guardian of Good, Golden Man
·
See more
See more
Powers and abilities
Flight
Flight
,
Superhuman strength
Superhuman strength
,
Immortality
Immortality
·
See more
See more
Species
Human
Human
People also ask
People also ask
Is the Sentry good or evil?
Is the Sentry good or evil?
What does "sentry" mean?
What does "sentry" mean?
What exactly is Sentry in Marvel?
What exactly is Sentry in Marvel?
What does a Sentry do?
What does a Sentry do?
Web results
Web results
Sentry (Robert Reynolds) Wikipedia https://en.wikipedia.org › wiki › Sentry_(Robert_Reyno...
Sentry (Robert Reynolds)
Sentry (Robert Reynolds)
Wikipedia
https://en.wikipedia.org
› wiki › Sentry_(Robert_Reyno...
About this result
The Sentry (Robert "Bob" Reynolds) and The Void are respectively
a superhero and supervillain
appearing in American comic books published by Marvel Comics.
SENTRY Definition & Meaning Merriam-Webster https://www.merriam-webster.com › dictionary › sentry
SENTRY Definition & Meaning
SENTRY Definition & Meaning
Merriam-Webster
https://www.merriam-webster.com
› dictionary › sentry
About this result
Apr 6, 2026
—
The meaning of SENTRY is
guard, watch; especially
: a soldier standing guard at a point of passage (such as a gate). How to use sentry in a ...
Sentry | Marvel Cinematic Universe Wiki - Fandom Marvel Cinematic Universe Wiki https://marvelcinematicuniverse.fandom.com › wiki › Se...
Sentry | Marvel Cinematic Universe Wiki - Fandom
Sentry | Marvel Cinematic Universe Wiki - Fandom
Marvel Cinematic Universe Wiki
https://marvelcinematicuniverse.fandom.com
› wiki › Se...
About this result
Robert "Bob" Reynolds
is a former meth addict who took part in Project Sentry, an operation by O.X.E. designed to create the ultimate superhero.
Sentry Docs | Application Performance Monitoring & Error ... Sentry Docs https://docs.sentry.io
Sentry Docs | Application Performance Monitoring & Error ...
Sentry Docs | Application Performance Monitoring & Error ...
Sentry Docs
https://docs.sentry.io
About this result
Sentry
provides end-to-end distributed tracing, enabling developers to identify and debug performance issues and errors across their systems and services.
Sentry (Robert Reynolds) Powers, Enemies, History Marvel.com https://www.marvel.com › characters › sentry-robert-re...
Sentry (Robert Reynolds) Powers, Enemies, History
Sentry (Robert Reynolds) Powers, Enemies, History
Marvel.com
https://www.marvel.com
› characters › sentry-robert-re...
About this result
The Sentry possesses remarkable levels of
superhuman strength, speed, and intelligence
, as well as invulnerability, enhanced senses, energy-projection ...
getsentry/sentry: Developer-first error tracking and ... GitHub https://github.com › getsentry › sentry
getsentry/sentry: Developer-first error tracking and ...
getsentry/sentry: Developer-first error tracking and ...
GitHub
https://github.com
› getsentry › sentry
About this result
Sentry
is the debugging platform that helps every developer detect, trace, and fix issues. Code breaks, fix it faster.
The Sentry: Home thesentry.org https://thesentry.org
The Sentry: Home
The Sentry: Home
thesentry.org
https://thesentry.org
About this result
The Sentry is
an investigative and policy organization
that seeks to disable multinational predatory networks that benefit from violent conflict, repression, ...
Sign up for Sentry to start your free trial. Sentry https://sentry.io › signup
Sign up for Sentry to start your free trial.
Sign up for Sentry to start your free trial.
Sentry
https://sentry.io
› signup
About this result
Debug any software issue
, onboard your team, and integrate with your systems. You get 14 days free on our Business plan to start — no credit card required.
Who is Sentry? : r/superheroes Reddit · r/superheroes 30+ comments · 11 months ago
Who is Sentry? : r/superheroes
Who is Sentry? : r/superheroes
Reddit · r/superheroes
30+ comments · 11 months ago
About this result
Sentry is a deeply traumatized man with severe psychological issues
. That's why he has an alternate personality called the Void, an evil force that takes ...
Sponsored result
Sponsored result
Resolve Application Errors | Visualize Key Metrics Datadog https://www.datadoghq.com › error-tracking › alternative
Resolve Application Errors | Visualize Key Metrics
Resolve Application Errors | Visualize Key Metrics
Datadog
https://www.datadoghq.com › error-tracking › alternative
Why this ad?
Visualize The Distribution Of Errors Across All Tags To Understand The Source Of The Issue. Track...
Datadog Free Trial
Datadog Free Trial...
|
52964
|
NULL
|
|
52969
|
1148
|
25
|
2026-04-20T07:50:47.184757+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776671447184_m1.jpg...
|
Firefox
|
sentry - Google Search — Work
|
1
|
sentry.io/welcome/
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
[JY-20543] AJ Reports > Tracking - Jira
[JY-20543] AJ Reports > Tracking - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
New Tab
New Tab
Product Growth Platform | Userpilot
Product Growth Platform | Userpilot
Userpilot | Events
Userpilot | Events
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
sentry - Google Search
sentry - Google Search
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Close bookmarks (⌘B)
Bookmarks
Bookmarks
Close sidebar
Search bookmarks
Skip to main content
Skip to main content
Accessibility help
Accessibility help
Accessibility feedback
Accessibility feedback
Go to Google Home
sentry
sentry
Clear
Search by voice
Search by image
Search
Google apps
Google Account: [EMAIL]
AI Mode
AI Mode
All
All
Images
Images
Videos
Videos
News
News
Forums
Forums
Short videos
Short videos
More filters
More
Tools
Tools
Search Results
Search Results
Sponsored result
Sponsored result
Resolve Application Errors - Unite Metrics, Traces, & Logs Datadog https://www.datadoghq.com › error-tracking › alternative
Resolve Application Errors - Unite Metrics, Traces, & Logs
Resolve Application Errors - Unite Metrics, Traces, & Logs
Datadog
https://www.datadoghq.com › error-tracking › alternative
Why this ad?
Visualize The Distribution Of Errors Across All Tags To Understand The Source Of The Issue. Track...
Datadog Free Trial Sign Up Today For A Free Trial And See Value Immediately.
Datadog Free Trial
Sign Up Today For A Free Trial And See Value Immediately.
Dynamic Monitoring Multidimensional Monitoring Built For Dynamic & Hybrid Architectures.
Dynamic Monitoring
Multidimensional Monitoring Built For Dynamic & Hybrid Architectures.
Logging Without Limits Manage All Logs Cost-Effectively & Only Pay To Index The Logs You Need
Logging Without Limits
Manage All Logs Cost-Effectively & Only Pay To Index The Logs You Need
1,000+ Integrations Datadog Offers And Supports Wide Coverage Across Any Technology.
1,000+ Integrations
Datadog Offers And Supports Wide Coverage Across Any Technology.
Unified Observability See Metrics, Traces, Logs, And More In A Single Pane View.
Unified Observability
See Metrics, Traces, Logs, And More In A Single Pane View.
Hide sponsored result
Hide sponsored result
Sentry
Sentry
Sentry
Comic book character
More options for Sentry
Image of Sentry | Marvel Cinematic Universe Wiki | Fandom
Image of Sentry (Robert Reynolds) - Wikipedia
Image of How do you all feel about the Sentry as a character? Is he ...
The Sentry and The Void are respectively a superhero and supervillain appearing in American comic books published by Marvel Comics. Created by Paul Jenkins and Jae Lee, with uncredited conceptual contributions by Rick Veitch, the characters first appeared in The Sentry #1.
Source:
Wikipedia
Wikipedia
Movie More info about this Thunderbolts*2025
Movie
Thunderbolts*
2025
Played by More info about this Lewis PullmanThunderbolts*
Played by
Lewis Pullman
Thunderbolts*
Web results
Web results
Sentry: Application Performance Monitoring & Error Tracking ... Sentry https://sentry.io › ...
Sentry: Application Performance Monitoring & Error Tracking ...
Sentry: Application Performance Monitoring & Error Tracking ...
Sentry
https://sentry.io...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20543] AJ Reports > Tracking - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20543] AJ Reports > Tracking - Jira","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Product Growth Platform | Userpilot","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Product Growth Platform | Userpilot","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Userpilot | Events","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Userpilot | Events","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipelines - jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"sentry - Google Search","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"sentry - Google Search","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Tab","depth":4,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Close bookmarks (⌘B)","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Bookmarks","depth":5,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Bookmarks","depth":6,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close sidebar","depth":6,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXTextField","text":"Search bookmarks","depth":7,"help_text":"","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Skip to main content","depth":7,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to main content","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Accessibility help","depth":7,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Accessibility help","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Accessibility feedback","depth":7,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Accessibility feedback","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Go to Google Home","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXComboBox","text":"sentry","depth":9,"value":"sentry","help_text":"","role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"sentry","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Clear","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Search by voice","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Search by image","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Search","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Google apps","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"Google Account: lukas.kovalik@jiminny.com","depth":8,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"AI Mode","depth":17,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"AI Mode","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"All","depth":17,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":false,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"All","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Images","depth":17,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Images","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Videos","depth":17,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Videos","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"News","depth":17,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"News","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Forums","depth":17,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Forums","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Short videos","depth":17,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Short videos","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"More filters","depth":17,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Tools","depth":16,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Tools","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Search Results","depth":8,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Search Results","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Sponsored result","depth":17,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sponsored result","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Resolve Application Errors - Unite Metrics, Traces, & Logs Datadog https://www.datadoghq.com › error-tracking › alternative","depth":17,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Resolve Application Errors - Unite Metrics, Traces, & Logs","depth":18,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Resolve Application Errors - Unite Metrics, Traces, & Logs","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Datadog","depth":22,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"https://www.datadoghq.com › error-tracking › alternative","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Why this ad?","depth":18,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Visualize The Distribution Of Errors Across All Tags To Understand The Source Of The Issue. Track...","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Datadog Free Trial Sign Up Today For A Free Trial And See Value Immediately.","depth":18,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Datadog Free Trial","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sign Up Today For A Free Trial And See Value Immediately.","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Dynamic Monitoring Multidimensional Monitoring Built For Dynamic & Hybrid Architectures.","depth":19,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Dynamic Monitoring","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Multidimensional Monitoring Built For Dynamic & Hybrid Architectures.","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Logging Without Limits Manage All Logs Cost-Effectively & Only Pay To Index The Logs You Need","depth":19,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Logging Without Limits","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Manage All Logs Cost-Effectively & Only Pay To Index The Logs You Need","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"1,000+ Integrations Datadog Offers And Supports Wide Coverage Across Any Technology.","depth":19,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"1,000+ Integrations","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Datadog Offers And Supports Wide Coverage Across Any Technology.","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Unified Observability See Metrics, Traces, Logs, And More In A Single Pane View.","depth":19,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Unified Observability","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"See Metrics, Traces, Logs, And More In A Single Pane View.","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Hide sponsored result","depth":13,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Hide sponsored result","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Sentry","depth":17,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Sentry","depth":18,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sentry","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Comic book character","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"More options for Sentry","depth":20,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Image of Sentry | Marvel Cinematic Universe Wiki | Fandom","depth":24,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Image of Sentry (Robert Reynolds) - Wikipedia","depth":24,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Image of How do you all feel about the Sentry as a character? Is he ...","depth":24,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"The Sentry and The Void are respectively a superhero and supervillain appearing in American comic books published by Marvel Comics. Created by Paul Jenkins and Jae Lee, with uncredited conceptual contributions by Rick Veitch, the characters first appeared in The Sentry #1.","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Source:","depth":22,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Wikipedia","depth":22,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Wikipedia","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Movie More info about this Thunderbolts*2025","depth":20,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Movie","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Thunderbolts*","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2025","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Played by More info about this Lewis PullmanThunderbolts*","depth":20,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Played by","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Lewis Pullman","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Thunderbolts*","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Web results","depth":16,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Web results","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Sentry: Application Performance Monitoring & Error Tracking ... Sentry https://sentry.io › ...","depth":17,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":true,"is_selected":false},{"role":"AXHeading","text":"Sentry: Application Performance Monitoring & Error Tracking ...","depth":18,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sentry: Application Performance Monitoring & Error Tracking ...","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sentry","depth":22,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"https://sentry.io","depth":22}]...
|
-3763190589858295150
|
-2369942869104638299
|
click
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
[JY-20543] AJ Reports > Tracking - Jira
[JY-20543] AJ Reports > Tracking - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
New Tab
New Tab
Product Growth Platform | Userpilot
Product Growth Platform | Userpilot
Userpilot | Events
Userpilot | Events
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
sentry - Google Search
sentry - Google Search
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Close bookmarks (⌘B)
Bookmarks
Bookmarks
Close sidebar
Search bookmarks
Skip to main content
Skip to main content
Accessibility help
Accessibility help
Accessibility feedback
Accessibility feedback
Go to Google Home
sentry
sentry
Clear
Search by voice
Search by image
Search
Google apps
Google Account: [EMAIL]
AI Mode
AI Mode
All
All
Images
Images
Videos
Videos
News
News
Forums
Forums
Short videos
Short videos
More filters
More
Tools
Tools
Search Results
Search Results
Sponsored result
Sponsored result
Resolve Application Errors - Unite Metrics, Traces, & Logs Datadog https://www.datadoghq.com › error-tracking › alternative
Resolve Application Errors - Unite Metrics, Traces, & Logs
Resolve Application Errors - Unite Metrics, Traces, & Logs
Datadog
https://www.datadoghq.com › error-tracking › alternative
Why this ad?
Visualize The Distribution Of Errors Across All Tags To Understand The Source Of The Issue. Track...
Datadog Free Trial Sign Up Today For A Free Trial And See Value Immediately.
Datadog Free Trial
Sign Up Today For A Free Trial And See Value Immediately.
Dynamic Monitoring Multidimensional Monitoring Built For Dynamic & Hybrid Architectures.
Dynamic Monitoring
Multidimensional Monitoring Built For Dynamic & Hybrid Architectures.
Logging Without Limits Manage All Logs Cost-Effectively & Only Pay To Index The Logs You Need
Logging Without Limits
Manage All Logs Cost-Effectively & Only Pay To Index The Logs You Need
1,000+ Integrations Datadog Offers And Supports Wide Coverage Across Any Technology.
1,000+ Integrations
Datadog Offers And Supports Wide Coverage Across Any Technology.
Unified Observability See Metrics, Traces, Logs, And More In A Single Pane View.
Unified Observability
See Metrics, Traces, Logs, And More In A Single Pane View.
Hide sponsored result
Hide sponsored result
Sentry
Sentry
Sentry
Comic book character
More options for Sentry
Image of Sentry | Marvel Cinematic Universe Wiki | Fandom
Image of Sentry (Robert Reynolds) - Wikipedia
Image of How do you all feel about the Sentry as a character? Is he ...
The Sentry and The Void are respectively a superhero and supervillain appearing in American comic books published by Marvel Comics. Created by Paul Jenkins and Jae Lee, with uncredited conceptual contributions by Rick Veitch, the characters first appeared in The Sentry #1.
Source:
Wikipedia
Wikipedia
Movie More info about this Thunderbolts*2025
Movie
Thunderbolts*
2025
Played by More info about this Lewis PullmanThunderbolts*
Played by
Lewis Pullman
Thunderbolts*
Web results
Web results
Sentry: Application Performance Monitoring & Error Tracking ... Sentry https://sentry.io › ...
Sentry: Application Performance Monitoring & Error Tracking ...
Sentry: Application Performance Monitoring & Error Tracking ...
Sentry
https://sentry.io...
|
52967
|
NULL
|
|
52970
|
1149
|
24
|
2026-04-20T07:50:47.107878+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776671447107_m2.jpg...
|
Firefox
|
sentry - Google Search — Work
|
1
|
sentry.io/welcome/
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
[JY-20543] AJ Reports > Tracking - Jira
[JY-20543] AJ Reports > Tracking - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
New Tab
New Tab
Product Growth Platform | Userpilot
Product Growth Platform | Userpilot
Userpilot | Events
Userpilot | Events
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
sentry - Google Search
sentry - Google Search
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Close bookmarks (⌘B)
Bookmarks
Bookmarks
Close sidebar
Search bookmarks
Skip to main content
Skip to main content
Accessibility help
Accessibility help
Accessibility feedback
Accessibility feedback
Go to Google Home
sentry
sentry
Clear
Search by voice
Search by image
Search
Google apps
Google Account: [EMAIL]
AI Mode
AI Mode
All
All
Images
Images
Videos
Videos
News
News
Forums
Forums
Short videos
Short videos
More filters
More
Tools
Tools
Search Results
Search Results
Sponsored result
Sponsored result
Resolve Application Errors - Unite Metrics, Traces, & Logs Datadog https://www.datadoghq.com › error-tracking › alternative
Resolve Application Errors - Unite Metrics, Traces, & Logs
Resolve Application Errors - Unite Metrics, Traces, & Logs
Datadog
https://www.datadoghq.com › error-tracking › alternative
Why this ad?
Visualize The Distribution Of Errors Across All Tags To Understand The Source Of The Issue. Track...
Datadog Free Trial Sign Up Today For A Free Trial And See Value Immediately.
Datadog Free Trial
Sign Up Today For A Free Trial And See Value Immediately.
Dynamic Monitoring Multidimensional Monitoring Built For Dynamic & Hybrid Architectures.
Dynamic Monitoring
Multidimensional Monitoring Built For Dynamic & Hybrid Architectures.
Logging Without Limits Manage All Logs Cost-Effectively & Only Pay To Index The Logs You Need
Logging Without Limits
Manage All Logs Cost-Effectively & Only Pay To Index The Logs You Need
1,000+ Integrations Datadog Offers And Supports Wide Coverage Across Any Technology.
1,000+ Integrations
Datadog Offers And Supports Wide Coverage Across Any Technology.
Unified Observability See Metrics, Traces, Logs, And More In A Single Pane View.
Unified Observability
See Metrics, Traces, Logs, And More In A Single Pane View.
Hide sponsored result
Hide sponsored result
Sentry
Sentry
Sentry
Comic book character
More options for Sentry
Image of Sentry | Marvel Cinematic Universe Wiki | Fandom
Image of Sentry (Robert Reynolds) - Wikipedia
Image of How do you all feel about the Sentry as a character? Is he ...
The Sentry and The Void are respectively a superhero and supervillain appearing in American comic books published by Marvel Comics. Created by Paul Jenkins and Jae Lee, with uncredited conceptual contributions by Rick Veitch, the characters first appeared in The Sentry #1.
Source:
Wikipedia
Wikipedia
Movie More info about this Thunderbolts*2025
Movie
Thunderbolts*
2025
Played by More info about this Lewis PullmanThunderbolts*
Played by
Lewis Pullman
Thunderbolts*
Web results
Web results
Sentry: Application Performance Monitoring & Error Tracking ... Sentry https://sentry.io › ...
Sentry: Application Performance Monitoring & Error Tracking ...
Sentry: Application Performance Monitoring & Error Tracking ...
Sentry
https://sentry.io
› ...
About this result
Application performance monitoring
for developers & software teams to see errors clearer, solve issues faster & continue learning continuously.
Dictionary
Dictionary
Definitions from
Oxford Languages
Oxford Languages
Learn more
Learn more
Listen
sentry
/
ˈsɛntri
/
noun
a soldier
stationed
stationed
to keep guard or to control access to a place.
"sentries patrolled the border"
Similar:
guard
guard
sentinel
sentinel
lookout
lookout
watch
watch
watchman
watchman
patrol
patrol
picket
picket
Show All Nyms
Feedback
Feedback
See more
See more
Creators
Paul Jenkins
Paul Jenkins
,
Jae Lee
Jae Lee
,
Rick Veitch
Rick Veitch
Fictional universe
Marvel Universe
Marvel Universe
Notable aliases
Bob, Golden Guardian of Good, Golden Man
·
See more
See more
Powers and abilities
Flight
Flight
,
Superhuman strength
Superhuman strength
,
Immortality
Immortality
·
See more
See more
Species
Human
Human
People also ask
People also ask...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"bounds":{"left":0.0018284575,"top":0.0518755,"width":0.07596409,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":4,"bounds":{"left":0.0,"top":0.09497207,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.10614525,"width":0.09524601,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.12769353,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.13886672,"width":0.19963431,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.16041501,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.17158818,"width":0.15525267,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20543] AJ Reports > Tracking - Jira","depth":4,"bounds":{"left":0.0,"top":0.19313647,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20543] AJ Reports > Tracking - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.20430966,"width":0.06981383,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira","depth":4,"bounds":{"left":0.0,"top":0.22585794,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.23703113,"width":0.10688165,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.2585794,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.2697526,"width":0.12915559,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"bounds":{"left":0.0,"top":0.29130086,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"bounds":{"left":0.013297873,"top":0.30247405,"width":0.014960106,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Product Growth Platform | Userpilot","depth":4,"bounds":{"left":0.0,"top":0.32402235,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Product Growth Platform | Userpilot","depth":5,"bounds":{"left":0.013297873,"top":0.33519554,"width":0.06200133,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Userpilot | Events","depth":4,"bounds":{"left":0.0,"top":0.3567438,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Userpilot | Events","depth":5,"bounds":{"left":0.013297873,"top":0.367917,"width":0.030418882,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.38946527,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.40063846,"width":0.2052859,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.42218676,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipelines - jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.43335995,"width":0.039228722,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"sentry - Google Search","depth":4,"bounds":{"left":0.0,"top":0.45490822,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"sentry - Google Search","depth":5,"bounds":{"left":0.013297873,"top":0.4660814,"width":0.040226065,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.06732048,"top":0.46209097,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.0028257978,"top":0.48922586,"width":0.07413564,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.0028257978,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.013796543,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.024933511,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.036070477,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Close bookmarks (⌘B)","depth":6,"bounds":{"left":0.04720745,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Bookmarks","depth":5,"bounds":{"left":0.083277926,"top":0.06943336,"width":0.026761968,"height":0.014764565},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Bookmarks","depth":6,"bounds":{"left":0.083277926,"top":0.06943336,"width":0.026761968,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close sidebar","depth":6,"bounds":{"left":0.1783577,"top":0.06424581,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXTextField","text":"Search bookmarks","depth":7,"bounds":{"left":0.082446806,"top":0.09976058,"width":0.107546546,"height":0.025538707},"help_text":"","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Skip to main content","depth":7,"bounds":{"left":0.19913563,"top":0.0981644,"width":0.03656915,"height":0.035115723},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to main content","depth":8,"bounds":{"left":0.20462102,"top":0.101356745,"width":0.025598405,"height":0.028731046},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Accessibility help","depth":7,"bounds":{"left":0.19913563,"top":0.0981644,"width":0.03656915,"height":0.035115723},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Accessibility help","depth":8,"bounds":{"left":0.20478724,"top":0.101356745,"width":0.025265958,"height":0.028731046},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Accessibility feedback","depth":7,"bounds":{"left":0.19913563,"top":0.12051077,"width":0.03656915,"height":0.035115723},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Accessibility feedback","depth":8,"bounds":{"left":0.20478724,"top":0.123703115,"width":0.025265958,"height":0.028731046},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Go to Google Home","depth":10,"bounds":{"left":0.2200798,"top":0.08060654,"width":0.030585106,"height":0.026336791},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXComboBox","text":"sentry","depth":9,"bounds":{"left":0.27227393,"top":0.07342378,"width":0.21875,"height":0.03990423},"value":"sentry","help_text":"","role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"sentry","depth":10,"bounds":{"left":0.27227393,"top":0.08539505,"width":0.015292553,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Clear","depth":9,"bounds":{"left":0.49102393,"top":0.07342378,"width":0.015957447,"height":0.03990423},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Search by voice","depth":9,"bounds":{"left":0.5086436,"top":0.083798885,"width":0.013297873,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Search by image","depth":9,"bounds":{"left":0.5219415,"top":0.083798885,"width":0.013297873,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Search","depth":9,"bounds":{"left":0.5365692,"top":0.07342378,"width":0.01462766,"height":0.03990423},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Google apps","depth":9,"bounds":{"left":0.96426195,"top":0.07741421,"width":0.013297873,"height":0.031923383},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"Google Account: lukas.kovalik@jiminny.com","depth":8,"bounds":{"left":0.9802194,"top":0.07741421,"width":0.013297873,"height":0.031923383},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"AI Mode","depth":17,"bounds":{"left":0.2679521,"top":0.12210695,"width":0.025930852,"height":0.03830806},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"AI Mode","depth":19,"bounds":{"left":0.27194148,"top":0.13647246,"width":0.017952127,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"All","depth":17,"bounds":{"left":0.29388297,"top":0.12210695,"width":0.013464096,"height":0.03830806},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":false,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"All","depth":20,"bounds":{"left":0.29787233,"top":0.13647246,"width":0.005485372,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Images","depth":17,"bounds":{"left":0.3073471,"top":0.12210695,"width":0.023769947,"height":0.03830806},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Images","depth":19,"bounds":{"left":0.31133643,"top":0.13647246,"width":0.015791224,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Videos","depth":17,"bounds":{"left":0.33111703,"top":0.12210695,"width":0.022772606,"height":0.03830806},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Videos","depth":19,"bounds":{"left":0.33510637,"top":0.13647246,"width":0.014793883,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"News","depth":17,"bounds":{"left":0.3538896,"top":0.12210695,"width":0.019946808,"height":0.03830806},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"News","depth":19,"bounds":{"left":0.35787898,"top":0.13647246,"width":0.011968086,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Forums","depth":17,"bounds":{"left":0.37383643,"top":0.12210695,"width":0.024102394,"height":0.03830806},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Forums","depth":19,"bounds":{"left":0.3778258,"top":0.13647246,"width":0.016123671,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Short videos","depth":17,"bounds":{"left":0.39793882,"top":0.12210695,"width":0.035738032,"height":0.03830806},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Short videos","depth":19,"bounds":{"left":0.4019282,"top":0.13647246,"width":0.027759308,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"More filters","depth":17,"bounds":{"left":0.43367687,"top":0.12210695,"width":0.025099734,"height":0.03830806},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More","depth":20,"bounds":{"left":0.43766624,"top":0.13647246,"width":0.011136968,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Tools","depth":16,"bounds":{"left":0.4587766,"top":0.12210695,"width":0.02543218,"height":0.03830806},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Tools","depth":18,"bounds":{"left":0.46276596,"top":0.13647246,"width":0.011469414,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Search Results","depth":8,"bounds":{"left":0.19547872,"top":0.16041501,"width":0.0003324468,"height":0.0007980846},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Search Results","depth":9,"bounds":{"left":0.19547872,"top":0.16041501,"width":0.03158245,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Sponsored result","depth":17,"bounds":{"left":0.27194148,"top":0.1963288,"width":0.055851065,"height":0.022346368},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sponsored result","depth":18,"bounds":{"left":0.27194148,"top":0.1963288,"width":0.055851065,"height":0.022346368},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Resolve Application Errors - Unite Metrics, Traces, & Logs Datadog https://www.datadoghq.com › error-tracking › alternative","depth":17,"bounds":{"left":0.27194148,"top":0.2849162,"width":0.16871676,"height":0.012769354},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Resolve Application Errors - Unite Metrics, Traces, & Logs","depth":18,"bounds":{"left":0.27194148,"top":0.27613726,"width":0.16871676,"height":0.023942538},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Resolve Application Errors - Unite Metrics, Traces, & Logs","depth":19,"bounds":{"left":0.27194148,"top":0.27972865,"width":0.16871676,"height":0.020351157},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Datadog","depth":22,"bounds":{"left":0.28523937,"top":0.24581006,"width":0.01761968,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"https://www.datadoghq.com › error-tracking › alternative","depth":21,"bounds":{"left":0.28523937,"top":0.26256984,"width":0.09823803,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Why this ad?","depth":18,"bounds":{"left":0.38613698,"top":0.2601756,"width":0.005984043,"height":0.017557861},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Visualize The Distribution Of Errors Across All Tags To Understand The Source Of The Issue. Track...","depth":17,"bounds":{"left":0.27194148,"top":0.3048683,"width":0.20844415,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Datadog Free Trial Sign Up Today For A Free Trial And See Value Immediately.","depth":18,"bounds":{"left":0.27726063,"top":0.34477255,"width":0.1888298,"height":0.03830806},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Datadog Free Trial","depth":20,"bounds":{"left":0.27726063,"top":0.34596968,"width":0.048537236,"height":0.018355945},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sign Up Today For A Free Trial And See Value Immediately.","depth":20,"bounds":{"left":0.27726063,"top":0.367917,"width":0.12333777,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Dynamic Monitoring Multidimensional Monitoring Built For Dynamic & Hybrid Architectures.","depth":19,"bounds":{"left":0.27726063,"top":0.40303272,"width":0.1888298,"height":0.03830806},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Dynamic Monitoring","depth":21,"bounds":{"left":0.27726063,"top":0.40422985,"width":0.05435505,"height":0.018355945},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Multidimensional Monitoring Built For Dynamic & Hybrid Architectures.","depth":21,"bounds":{"left":0.27726063,"top":0.42617717,"width":0.14461437,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Logging Without Limits Manage All Logs Cost-Effectively & Only Pay To Index The Logs You Need","depth":19,"bounds":{"left":0.27726063,"top":0.4612929,"width":0.1888298,"height":0.03830806},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Logging Without Limits","depth":21,"bounds":{"left":0.27726063,"top":0.46249002,"width":0.06200133,"height":0.018355945},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Manage All Logs Cost-Effectively & Only Pay To Index The Logs You Need","depth":21,"bounds":{"left":0.27726063,"top":0.48443735,"width":0.15392287,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"1,000+ Integrations Datadog Offers And Supports Wide Coverage Across Any Technology.","depth":19,"bounds":{"left":0.27726063,"top":0.51955307,"width":0.1888298,"height":0.03830806},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"1,000+ Integrations","depth":21,"bounds":{"left":0.27726063,"top":0.5207502,"width":0.05219415,"height":0.018355945},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Datadog Offers And Supports Wide Coverage Across Any Technology.","depth":21,"bounds":{"left":0.27726063,"top":0.54269755,"width":0.14494681,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Unified Observability See Metrics, Traces, Logs, And More In A Single Pane View.","depth":19,"bounds":{"left":0.27726063,"top":0.57781327,"width":0.1888298,"height":0.03830806},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Unified Observability","depth":21,"bounds":{"left":0.27726063,"top":0.57901037,"width":0.05651596,"height":0.018355945},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"See Metrics, Traces, Logs, And More In A Single Pane View.","depth":21,"bounds":{"left":0.27726063,"top":0.6009577,"width":0.12483378,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Hide sponsored result","depth":13,"bounds":{"left":0.27194148,"top":0.65363127,"width":0.21675532,"height":0.044692736},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Hide sponsored result","depth":16,"bounds":{"left":0.3515625,"top":0.6624102,"width":0.048204787,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Sentry","depth":17,"bounds":{"left":0.51396275,"top":0.17956904,"width":0.028424202,"height":0.028731046},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Sentry","depth":18,"bounds":{"left":0.51396275,"top":0.17956904,"width":0.028424202,"height":0.028731046},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sentry","depth":19,"bounds":{"left":0.51396275,"top":0.17956904,"width":0.028424202,"height":0.028731046},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Comic book character","depth":18,"bounds":{"left":0.51396275,"top":0.2122905,"width":0.045212764,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"More options for Sentry","depth":20,"bounds":{"left":0.5611702,"top":0.20909816,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Image of Sentry | Marvel Cinematic Universe Wiki | Fandom","depth":24,"bounds":{"left":0.51396275,"top":0.24181964,"width":0.06981383,"height":0.1915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Image of Sentry (Robert Reynolds) - Wikipedia","depth":24,"bounds":{"left":0.5844415,"top":0.24181964,"width":0.05319149,"height":0.09497207},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Image of How do you all feel about the Sentry as a character? Is he ...","depth":24,"bounds":{"left":0.5844415,"top":0.33838788,"width":0.05319149,"height":0.09497207},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"The Sentry and The Void are respectively a superhero and supervillain appearing in American comic books published by Marvel Comics. Created by Paul Jenkins and Jae Lee, with uncredited conceptual contributions by Rick Veitch, the characters first appeared in The Sentry #1.","depth":21,"bounds":{"left":0.51396275,"top":0.4445331,"width":0.12250665,"height":0.08499601},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Source:","depth":22,"bounds":{"left":0.51396275,"top":0.5482841,"width":0.016123671,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Wikipedia","depth":22,"bounds":{"left":0.53008646,"top":0.5482841,"width":0.021609042,"height":0.014764565},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Wikipedia","depth":24,"bounds":{"left":0.53125,"top":0.5482841,"width":0.02044548,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Movie More info about this Thunderbolts*2025","depth":20,"bounds":{"left":0.51396275,"top":0.5738228,"width":0.059840426,"height":0.08499601},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Movie","depth":24,"bounds":{"left":0.51795214,"top":0.584996,"width":0.013131649,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Thunderbolts*","depth":25,"bounds":{"left":0.51795214,"top":0.6097366,"width":0.04288564,"height":0.020351157},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2025","depth":25,"bounds":{"left":0.51795214,"top":0.6340782,"width":0.010638298,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Played by More info about this Lewis PullmanThunderbolts*","depth":20,"bounds":{"left":0.5777925,"top":0.5738228,"width":0.059840426,"height":0.08499601},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Played by","depth":24,"bounds":{"left":0.5817819,"top":0.584996,"width":0.021276595,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Lewis Pullman","depth":25,"bounds":{"left":0.5817819,"top":0.6097366,"width":0.041722074,"height":0.020351157},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Thunderbolts*","depth":25,"bounds":{"left":0.5817819,"top":0.6340782,"width":0.030585106,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Web results","depth":16,"bounds":{"left":0.27194148,"top":0.7186752,"width":0.0003324468,"height":0.0007980846},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Web results","depth":17,"bounds":{"left":0.27194148,"top":0.7178771,"width":0.03939495,"height":0.01915403},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Sentry: Application Performance Monitoring & Error Tracking ... Sentry https://sentry.io › ...","depth":17,"bounds":{"left":0.27194148,"top":0.7102953,"width":0.18550532,"height":0.039505187},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":true,"is_selected":false},{"role":"AXHeading","text":"Sentry: Application Performance Monitoring & Error Tracking ...","depth":18,"bounds":{"left":0.27194148,"top":0.7350359,"width":0.18550532,"height":0.024740623},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sentry: Application Performance Monitoring & Error Tracking ...","depth":19,"bounds":{"left":0.27194148,"top":0.73942536,"width":0.18550532,"height":0.020351157},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sentry","depth":22,"bounds":{"left":0.28523937,"top":0.70630485,"width":0.013464096,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"https://sentry.io","depth":22,"bounds":{"left":0.28523937,"top":0.72226655,"width":0.026761968,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"› ...","depth":23,"bounds":{"left":0.31200132,"top":0.72226655,"width":0.0068151597,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"About this result","depth":17,"bounds":{"left":0.32147607,"top":0.71907425,"width":0.00930851,"height":0.015961692},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Application performance monitoring","depth":18,"bounds":{"left":0.27194148,"top":0.76456505,"width":0.08045213,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"for developers & software teams to see errors clearer, solve issues faster & continue learning continuously.","depth":17,"bounds":{"left":0.27194148,"top":0.76456505,"width":0.2044548,"height":0.030327214},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Dictionary","depth":18,"bounds":{"left":0.27194148,"top":0.8308061,"width":0.03374335,"height":0.022346368},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Dictionary","depth":20,"bounds":{"left":0.27194148,"top":0.8308061,"width":0.03374335,"height":0.022346368},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Definitions from","depth":19,"bounds":{"left":0.27194148,"top":0.8603352,"width":0.028756648,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Oxford Languages","depth":19,"bounds":{"left":0.30069813,"top":0.8603352,"width":0.032912236,"height":0.011173184},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Oxford Languages","depth":20,"bounds":{"left":0.30069813,"top":0.8603352,"width":0.032912236,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Learn more","depth":19,"bounds":{"left":0.33710107,"top":0.8603352,"width":0.02044548,"height":0.011173184},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Learn more","depth":20,"bounds":{"left":0.33710107,"top":0.8603352,"width":0.02044548,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Listen","depth":18,"bounds":{"left":0.2699468,"top":0.8898643,"width":0.015957447,"height":0.03830806},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sentry","depth":20,"bounds":{"left":0.28789893,"top":0.8882682,"width":0.02642952,"height":0.028731046},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":20,"bounds":{"left":0.28789893,"top":0.91779727,"width":0.0011635638,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ˈsɛntri","depth":20,"bounds":{"left":0.2890625,"top":0.91779727,"width":0.010638298,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":20,"bounds":{"left":0.2997008,"top":0.91779727,"width":0.0011635638,"height":0.011173184},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"noun","depth":19,"bounds":{"left":0.27194148,"top":0.94493216,"width":0.010305851,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"a soldier","depth":21,"bounds":{"left":0.27726063,"top":0.9680766,"width":0.021941489,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"stationed","depth":21,"bounds":{"left":0.2992021,"top":0.9680766,"width":0.022772606,"height":0.016360734},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"stationed","depth":22,"bounds":{"left":0.2992021,"top":0.9680766,"width":0.022772606,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"to keep guard or to control access to a place.","depth":21,"bounds":{"left":0.32197472,"top":0.9680766,"width":0.110538565,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"sentries patrolled the border\"","depth":23,"bounds":{"left":0.27726063,"top":0.9896249,"width":0.061170213,"height":0.0103750825},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Similar:","depth":23,"bounds":{"left":0.27726063,"top":1.0,"width":0.015458777,"height":-0.021548271},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"guard","depth":23,"bounds":{"left":0.29537898,"top":1.0,"width":0.020944148,"height":-0.01516366},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"guard","depth":24,"bounds":{"left":0.30069813,"top":1.0,"width":0.010305851,"height":-0.022346377},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"sentinel","depth":23,"bounds":{"left":0.31898272,"top":1.0,"width":0.024268618,"height":-0.01516366},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sentinel","depth":24,"bounds":{"left":0.32430187,"top":1.0,"width":0.013630319,"height":-0.022346377},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"lookout","depth":23,"bounds":{"left":0.3459109,"top":1.0,"width":0.023603724,"height":-0.01516366},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"lookout","depth":24,"bounds":{"left":0.35123006,"top":1.0,"width":0.012965426,"height":-0.022346377},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"watch","depth":23,"bounds":{"left":0.3721742,"top":1.0,"width":0.020944148,"height":-0.01516366},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"watch","depth":24,"bounds":{"left":0.37749335,"top":1.0,"width":0.010305851,"height":-0.022346377},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"watchman","depth":23,"bounds":{"left":0.3957779,"top":1.0,"width":0.028922873,"height":-0.01516366},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"watchman","depth":24,"bounds":{"left":0.4010971,"top":1.0,"width":0.018284574,"height":-0.022346377},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"patrol","depth":23,"bounds":{"left":0.4273604,"top":1.0,"width":0.020611702,"height":-0.01516366},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"patrol","depth":24,"bounds":{"left":0.43267953,"top":1.0,"width":0.009973404,"height":-0.022346377},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"picket","depth":23,"bounds":{"left":0.45063165,"top":1.0,"width":0.020944148,"height":-0.01516366},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"picket","depth":24,"bounds":{"left":0.4559508,"top":1.0,"width":0.010305851,"height":-0.022346377},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Show All Nyms","depth":22,"bounds":{"left":0.47772607,"top":1.0,"width":0.010638298,"height":-0.00877893},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Feedback","depth":17,"bounds":{"left":0.47124335,"top":1.0,"width":0.017453458,"height":-0.06304872},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Feedback","depth":19,"bounds":{"left":0.47124335,"top":1.0,"width":0.017453458,"height":-0.06304872},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"See more","depth":18,"bounds":{"left":0.31848404,"top":1.0,"width":0.12367021,"height":-0.07302475},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"See more","depth":20,"bounds":{"left":0.36535904,"top":1.0,"width":0.020611702,"height":-0.081404686},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Creators","depth":21,"bounds":{"left":0.51795214,"top":0.7218675,"width":0.018949468,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Paul Jenkins","depth":22,"bounds":{"left":0.55668217,"top":0.7186752,"width":0.025764627,"height":0.021149242},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Paul Jenkins","depth":23,"bounds":{"left":0.55668217,"top":0.7218675,"width":0.025764627,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":",","depth":22,"bounds":{"left":0.5824468,"top":0.7218675,"width":0.0021609042,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Jae Lee","depth":22,"bounds":{"left":0.5846077,"top":0.7186752,"width":0.01662234,"height":0.021149242},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jae Lee","depth":23,"bounds":{"left":0.5846077,"top":0.7218675,"width":0.01662234,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":",","depth":22,"bounds":{"left":0.60123,"top":0.7218675,"width":0.002493351,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Rick Veitch","depth":22,"bounds":{"left":0.6037234,"top":0.7186752,"width":0.022772606,"height":0.021149242},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Rick Veitch","depth":23,"bounds":{"left":0.6037234,"top":0.7218675,"width":0.022772606,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Fictional universe","depth":21,"bounds":{"left":0.51795214,"top":0.7601756,"width":0.01861702,"height":0.032322425},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Marvel Universe","depth":22,"bounds":{"left":0.55668217,"top":0.7569832,"width":0.03357713,"height":0.021149242},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Marvel Universe","depth":23,"bounds":{"left":0.55668217,"top":0.7601756,"width":0.03357713,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Notable aliases","depth":21,"bounds":{"left":0.51795214,"top":0.8160415,"width":0.033410903,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Bob, Golden Guardian of Good, Golden Man","depth":22,"bounds":{"left":0.55668217,"top":0.8160415,"width":0.06582447,"height":0.032322425},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":22,"bounds":{"left":0.58211434,"top":0.8335994,"width":0.0034906915,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"See more","depth":22,"bounds":{"left":0.585605,"top":0.830407,"width":0.020113032,"height":0.021149242},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"See more","depth":24,"bounds":{"left":0.585605,"top":0.8335994,"width":0.020113032,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Powers and abilities","depth":21,"bounds":{"left":0.51795214,"top":0.8719074,"width":0.025265958,"height":0.032322425},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Flight","depth":22,"bounds":{"left":0.55668217,"top":0.8687151,"width":0.011635638,"height":0.021149242},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Flight","depth":23,"bounds":{"left":0.55668217,"top":0.8719074,"width":0.011635638,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":",","depth":22,"bounds":{"left":0.56831783,"top":0.8719074,"width":0.0023271276,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Superhuman strength","depth":22,"bounds":{"left":0.570645,"top":0.8687151,"width":0.046043884,"height":0.021149242},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Superhuman strength","depth":23,"bounds":{"left":0.570645,"top":0.8719074,"width":0.046043884,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":",","depth":22,"bounds":{"left":0.61668885,"top":0.8719074,"width":0.0011635638,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Immortality","depth":22,"bounds":{"left":0.55668217,"top":0.88627297,"width":0.023936171,"height":0.021149242},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Immortality","depth":23,"bounds":{"left":0.55668217,"top":0.8894653,"width":0.023936171,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":22,"bounds":{"left":0.5806183,"top":0.8894653,"width":0.0034906915,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"See more","depth":22,"bounds":{"left":0.58410907,"top":0.88627297,"width":0.020113032,"height":0.021149242},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"See more","depth":24,"bounds":{"left":0.58410907,"top":0.8894653,"width":0.020113032,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Species","depth":21,"bounds":{"left":0.51795214,"top":0.92777336,"width":0.017287234,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Human","depth":22,"bounds":{"left":0.55668217,"top":0.924581,"width":0.014960106,"height":0.021149242},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Human","depth":23,"bounds":{"left":0.55668217,"top":0.92777336,"width":0.014960106,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"People also ask","depth":16,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"People also ask","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-5890398030969889633
|
-2515188372328398172
|
click
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
[JY-20543] AJ Reports > Tracking - Jira
[JY-20543] AJ Reports > Tracking - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
New Tab
New Tab
Product Growth Platform | Userpilot
Product Growth Platform | Userpilot
Userpilot | Events
Userpilot | Events
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
sentry - Google Search
sentry - Google Search
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Close bookmarks (⌘B)
Bookmarks
Bookmarks
Close sidebar
Search bookmarks
Skip to main content
Skip to main content
Accessibility help
Accessibility help
Accessibility feedback
Accessibility feedback
Go to Google Home
sentry
sentry
Clear
Search by voice
Search by image
Search
Google apps
Google Account: [EMAIL]
AI Mode
AI Mode
All
All
Images
Images
Videos
Videos
News
News
Forums
Forums
Short videos
Short videos
More filters
More
Tools
Tools
Search Results
Search Results
Sponsored result
Sponsored result
Resolve Application Errors - Unite Metrics, Traces, & Logs Datadog https://www.datadoghq.com › error-tracking › alternative
Resolve Application Errors - Unite Metrics, Traces, & Logs
Resolve Application Errors - Unite Metrics, Traces, & Logs
Datadog
https://www.datadoghq.com › error-tracking › alternative
Why this ad?
Visualize The Distribution Of Errors Across All Tags To Understand The Source Of The Issue. Track...
Datadog Free Trial Sign Up Today For A Free Trial And See Value Immediately.
Datadog Free Trial
Sign Up Today For A Free Trial And See Value Immediately.
Dynamic Monitoring Multidimensional Monitoring Built For Dynamic & Hybrid Architectures.
Dynamic Monitoring
Multidimensional Monitoring Built For Dynamic & Hybrid Architectures.
Logging Without Limits Manage All Logs Cost-Effectively & Only Pay To Index The Logs You Need
Logging Without Limits
Manage All Logs Cost-Effectively & Only Pay To Index The Logs You Need
1,000+ Integrations Datadog Offers And Supports Wide Coverage Across Any Technology.
1,000+ Integrations
Datadog Offers And Supports Wide Coverage Across Any Technology.
Unified Observability See Metrics, Traces, Logs, And More In A Single Pane View.
Unified Observability
See Metrics, Traces, Logs, And More In A Single Pane View.
Hide sponsored result
Hide sponsored result
Sentry
Sentry
Sentry
Comic book character
More options for Sentry
Image of Sentry | Marvel Cinematic Universe Wiki | Fandom
Image of Sentry (Robert Reynolds) - Wikipedia
Image of How do you all feel about the Sentry as a character? Is he ...
The Sentry and The Void are respectively a superhero and supervillain appearing in American comic books published by Marvel Comics. Created by Paul Jenkins and Jae Lee, with uncredited conceptual contributions by Rick Veitch, the characters first appeared in The Sentry #1.
Source:
Wikipedia
Wikipedia
Movie More info about this Thunderbolts*2025
Movie
Thunderbolts*
2025
Played by More info about this Lewis PullmanThunderbolts*
Played by
Lewis Pullman
Thunderbolts*
Web results
Web results
Sentry: Application Performance Monitoring & Error Tracking ... Sentry https://sentry.io › ...
Sentry: Application Performance Monitoring & Error Tracking ...
Sentry: Application Performance Monitoring & Error Tracking ...
Sentry
https://sentry.io
› ...
About this result
Application performance monitoring
for developers & software teams to see errors clearer, solve issues faster & continue learning continuously.
Dictionary
Dictionary
Definitions from
Oxford Languages
Oxford Languages
Learn more
Learn more
Listen
sentry
/
ˈsɛntri
/
noun
a soldier
stationed
stationed
to keep guard or to control access to a place.
"sentries patrolled the border"
Similar:
guard
guard
sentinel
sentinel
lookout
lookout
watch
watch
watchman
watchman
patrol
patrol
picket
picket
Show All Nyms
Feedback
Feedback
See more
See more
Creators
Paul Jenkins
Paul Jenkins
,
Jae Lee
Jae Lee
,
Rick Veitch
Rick Veitch
Fictional universe
Marvel Universe
Marvel Universe
Notable aliases
Bob, Golden Guardian of Good, Golden Man
·
See more
See more
Powers and abilities
Flight
Flight
,
Superhuman strength
Superhuman strength
,
Immortality
Immortality
·
See more
See more
Species
Human
Human
People also ask
People also ask...
|
NULL
|
NULL
|
|
61379
|
1325
|
11
|
2026-04-21T06:53:01.633986+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-21/1776 /Users/lukas/.screenpipe/data/data/2026-04-21/1776754381633_m2.jpg...
|
iTerm2
|
sh
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Tue Apr 21 09:37:45 on ttys013
DOCKER
Last login: Tue Apr 21 09:37:45 on ttys013
DOCKER
Close Tab
-zsh
Close Tab
-zsh
Close Tab
✳ Build full day activity summary from Screenpipe (node)
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
APP (-zsh)
Close Tab
ec2-user@ip-10-30-159-186:~ (nc)
Close Tab
sh
Close Tab
⌥⌘1
sh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Tue Apr 21 09:37:45 on ttys013","depth":4,"bounds":{"left":0.5,"top":0.06304868,"width":0.5,"height":0.93695134},"value":"Last login: Tue Apr 21 09:37:45 on ttys013","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.5,"top":0.042298485,"width":0.0546875,"height":0.01915403},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50199467,"top":0.045490824,"width":0.005319149,"height":0.012769354},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5546875,"top":0.042298485,"width":0.0546875,"height":0.01915403},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.55668217,"top":0.045490824,"width":0.005319149,"height":0.012769354},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.609375,"top":0.042298485,"width":0.0546875,"height":0.01915403},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.61136967,"top":0.045490824,"width":0.005319149,"height":0.012769354},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"✳ Build full day activity summary from Screenpipe (node)","depth":2,"bounds":{"left":0.6640625,"top":0.042298485,"width":0.0546875,"height":0.01915403},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.66605717,"top":0.045490824,"width":0.005319149,"height":0.012769354},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.71875,"top":0.042298485,"width":0.0546875,"height":0.01915403},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.72074467,"top":0.045490824,"width":0.005319149,"height":0.012769354},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.7734375,"top":0.042298485,"width":0.0546875,"height":0.01915403},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.77543217,"top":0.045490824,"width":0.005319149,"height":0.012769354},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.828125,"top":0.042298485,"width":0.0546875,"height":0.01915403},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.83011967,"top":0.045490824,"width":0.005319149,"height":0.012769354},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-159-186:~ (nc)","depth":2,"bounds":{"left":0.8828125,"top":0.042298485,"width":0.0546875,"height":0.01915403},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.88480717,"top":0.045490824,"width":0.005319149,"height":0.012769354},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"sh","depth":2,"bounds":{"left":0.9375,"top":0.042298485,"width":0.054521278,"height":0.01915403},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.93949467,"top":0.045490824,"width":0.005319149,"height":0.012769354},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.97839093,"top":0.023144454,"width":0.01861702,"height":0.013567438},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"sh","depth":1,"bounds":{"left":0.74667555,"top":0.023942538,"width":0.0066489363,"height":0.012769354},"role_description":"text"}]...
|
3284653618903947572
|
443272969047854521
|
visual_change
|
hybrid
|
NULL
|
Last login: Tue Apr 21 09:37:45 on ttys013
DOCKER
Last login: Tue Apr 21 09:37:45 on ttys013
DOCKER
Close Tab
-zsh
Close Tab
-zsh
Close Tab
✳ Build full day activity summary from Screenpipe (node)
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
APP (-zsh)
Close Tab
ec2-user@ip-10-30-159-186:~ (nc)
Close Tab
sh
Close Tab
⌥⌘1
sh
lermzsnellVIewsessionScriptsProtllesWindowmelpJ JIMINNY83|* Build full day…. 84"Dally - Platrorm • now100% C48• Tue 21 Apr 9:53:01APP (-zsh)ec2-user@ip-10-3... 2889• Search|Last login: Tue Apr 21 09:37:45 on ttys013IY [SRD-6793] Les Mills activity t X[SRD-6787] Issue with reconnectilX Jiminny MCP Connector - Product(JY-20676] Notify the user if a ParM Jiminny Mail(JY-20500) Batch initial sync for SIa Feed — jiminny — Sentry& Jiminny() JY-20701 | Reschedule HubSpot SPipelines - jiminny/appNew Tab— New Tabg For you(• Recenti* Starred0+ Apps|Q Spaces+ ***1 Service-Desk•, Queues+ ...Team Priorityj All open tickets 12•, Unassigned t... 25 Support tea...j Raised by me•, Assianed to ...E Service requ..4Ej Platform team•, Processing t..Site reliability... 0j New features... 0•, InfoSec issues 0bi Readv for Cu... 0j Resolved ti... 999+= View all queues >• Service reauestsA Incidentsll Reports@: Operations• Knowledge Base° Customers• Channels• Email loasI< Developer escalationsSlack integration& Reporting Center[* Add shortcut, backSKU"O/ySCustomer typeEnterpriseActual outcomelNo activity types are being importedExpected outcomeThe activity types to get importedSeverity levelS2ImpactRoot causeVia have no access to FieldDefinition (needed to sync activity types).Linked work itemsrelates to# JY-20698 Les Mills activity tvpes not pulling inActivityCommentsHistory Work log ApprovalsAdd internal note / Reply to customerPro tio: oress M to comment|Lukas Kovalik 1 minute ago Edited & Internal notePulsar seems to be working fine. I created new playbooks, and the fields were populated, includimissing.For e Mile atir yet moy he eae une we e ter syne has ne er me sha no aoceydoesn't seem to have access to the Organization. Therefore, we can't sync team metadata succe1 [2026-04-21 06:39:44] production.ERROR: [Salesforce] Request exception [4et • Edit • DeleteStovan Tomov 5 davs ado A Internal noteFYI. Pulsar Group (EU) is facina the same issue.€ • Edit • Delete...
|
NULL
|
NULL
|
|
75510
|
1883
|
8
|
2026-04-24T06:32:11.225722+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-24/1777 /Users/lukas/.screenpipe/data/data/2026-04-24/1777012331225_m1.jpg...
|
iTerm2
|
sleep
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Thu Apr 23 14:01:29 on ttys009
Poetry Last login: Thu Apr 23 14:01:29 on ttys009
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe/data/data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-04-23
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-23 $ ll
total 338296
drwxr-xr-x 106 lukas staff 3392 24 Apr 09:20 .
drwxr-xr-x 17 lukas staff 544 24 Apr 09:19 ..
-rw-r--r-- 1 lukas staff 174550 23 Apr 11:38 1776933481776_m1.jpg
-rw-r--r-- 1 lukas staff 1448572 23 Apr 09:24 compact_monitor_1_1776925466477.mp4
-rw-r--r-- 1 lukas staff 2157204 23 Apr 09:29 compact_monitor_1_1776925771961.mp4
-rw-r--r-- 1 lukas staff 785851 23 Apr 09:34 compact_monitor_1_1776926078542.mp4
-rw-r--r-- 1 lukas staff 319924 23 Apr 09:39 compact_monitor_1_1776926389122.mp4
-rw-r--r-- 1 lukas staff 178437 23 Apr 09:44 compact_monitor_1_1776926696343.mp4
-rw-r--r-- 1 lukas staff 182316 23 Apr 09:50 compact_monitor_1_1776927001989.mp4
-rw-r--r-- 1 lukas staff 475405 23 Apr 09:55 compact_monitor_1_1776927311821.mp4
-rw-r--r-- 1 lukas staff 3670216 23 Apr 10:00 compact_monitor_1_1776927616817.mp4
-rw-r--r-- 1 lukas staff 1311845 23 Apr 10:05 compact_monitor_1_1776927930717.mp4
-rw-r--r-- 1 lukas staff 1768745 23 Apr 10:10 compact_monitor_1_1776928242002.mp4
-rw-r--r-- 1 lukas staff 942473 23 Apr 10:15 compact_monitor_1_1776928549085.mp4
-rw-r--r-- 1 lukas staff 911130 23 Apr 10:20 compact_monitor_1_1776928854473.mp4
-rw-r--r-- 1 lukas staff 1249531 23 Apr 10:26 compact_monitor_1_1776929165912.mp4
-rw-r--r-- 1 lukas staff 2106654 23 Apr 10:31 compact_monitor_1_1776929476115.mp4
-rw-r--r-- 1 lukas staff 1633583 23 Apr 10:36 compact_monitor_1_1776929781778.mp4
-rw-r--r-- 1 lukas staff 1186578 23 Apr 10:41 compact_monitor_1_1776930087801.mp4
-rw-r--r-- 1 lukas staff 322993 23 Apr 10:46 compact_monitor_1_1776930392335.mp4
-rw-r--r-- 1 lukas staff 120434 23 Apr 10:51 compact_monitor_1_1776930696294.mp4
-rw-r--r-- 1 lukas staff 111489 23 Apr 10:56 compact_monitor_1_1776931004441.mp4
-rw-r--r-- 1 lukas staff 560588 23 Apr 11:01 compact_monitor_1_1776931314879.mp4
-rw-r--r-- 1 lukas staff 2146373 23 Apr 11:07 compact_monitor_1_1776931618003.mp4
-rw-r--r-- 1 lukas staff 1276021 23 Apr 11:12 compact_monitor_1_1776931930806.mp4
-rw-r--r-- 1 lukas staff 274120 23 Apr 11:17 compact_monitor_1_1776932235717.mp4
-rw-r--r-- 1 lukas staff 212162 23 Apr 11:22 compact_monitor_1_1776932541353.mp4
-rw-r--r-- 1 lukas staff 639071 23 Apr 11:27 compact_monitor_1_1776932847264.mp4
-rw-r--r-- 1 lukas staff 315645 23 Apr 11:32 compact_monitor_1_1776933174068.mp4
-rw-r--r-- 1 lukas staff 518635 23 Apr 11:38 compact_monitor_1_1776933492233.mp4
-rw-r--r-- 1 lukas staff 1886880 23 Apr 11:43 compact_monitor_1_1776933806263.mp4
-rw-r--r-- 1 lukas staff 2316900 23 Apr 11:48 compact_monitor_1_1776934133065.mp4
-rw-r--r-- 1 lukas staff 1589469 23 Apr 11:54 compact_monitor_1_1776934449640.mp4
-rw-r--r-- 1 lukas staff 592352 23 Apr 11:59 compact_monitor_1_1776934755385.mp4
-rw-r--r-- 1 lukas staff 1631938 23 Apr 12:04 compact_monitor_1_1776935058652.mp4
-rw-r--r-- 1 lukas staff 6099603 23 Apr 12:24 compact_monitor_1_1776936289062.mp4
-rw-r--r-- 1 lukas staff 91125 23 Apr 12:35 compact_monitor_1_1776936919782.mp4
-rw-r--r-- 1 lukas staff 2955581 23 Apr 12:40 compact_monitor_1_1776937224602.mp4
-rw-r--r-- 1 lukas staff 3002373 23 Apr 12:45 compact_monitor_1_1776937538337.mp4
-rw-r--r-- 1 lukas staff 3116117 23 Apr 12:50 compact_monitor_1_1776937842939.mp4
-rw-r--r-- 1 lukas staff 2426878 23 Apr 12:55 compact_monitor_1_1776938150380.mp4
-rw-r--r-- 1 lukas staff 2028056 23 Apr 13:01 compact_monitor_1_1776938459676.mp4
-rw-r--r-- 1 lukas staff 2104678 23 Apr 13:06 compact_monitor_1_1776938769006.mp4
-rw-r--r-- 1 lukas staff 3004512 23 Apr 13:11 compact_monitor_1_1776939078771.mp4
-rw-r--r-- 1 lukas staff 1643140 23 Apr 13:16 compact_monitor_1_1776939389326.mp4
-rw-r--r-- 1 lukas staff 1923058 23 Apr 13:21 compact_monitor_1_1776939706398.mp4
-rw-r--r-- 1 lukas staff 900757 23 Apr 13:26 compact_monitor_1_1776940011813.mp4
-rw-r--r-- 1 lukas staff 2964075 23 Apr 13:32 compact_monitor_1_1776940319106.mp4
-rw-r--r-- 1 lukas staff 2419466 23 Apr 13:37 compact_monitor_1_1776940628353.mp4
-rw-r--r-- 1 lukas staff 2447997 23 Apr 13:42 compact_monitor_1_1776940941730.mp4
-rw-r--r-- 1 lukas staff 2202220 23 Apr 13:47 compact_monitor_1_1776941248366.mp4
-rw-r--r-- 1 lukas staff 2309716 23 Apr 13:52 compact_monitor_1_1776941558220.mp4
-rw-r--r-- 1 lukas staff 2049791 23 Apr 13:57 compact_monitor_1_1776941868192.mp4
-rw-r--r-- 1 lukas staff 6097615 24 Apr 09:20 compact_monitor_1_1777011631828.mp4
-rw-r--r-- 1 lukas staff 215938 23 Apr 09:24 compact_monitor_2_1776925467316.mp4
-rw-r--r-- 1 lukas staff 3956084 23 Apr 09:29 compact_monitor_2_1776925774333.mp4
-rw-r--r-- 1 lukas staff 3998164 23 Apr 09:34 compact_monitor_2_1776926081685.mp4
-rw-r--r-- 1 lukas staff 2446471 23 Apr 09:39 compact_monitor_2_1776926391115.mp4
-rw-r--r-- 1 lukas staff 776043 23 Apr 09:44 compact_monitor_2_1776926697217.mp4
-rw-r--r-- 1 lukas staff 802594 23 Apr 09:50 compact_monitor_2_1776927003100.mp4
-rw-r--r-- 1 lukas staff 1453164 23 Apr 09:55 compact_monitor_2_1776927313533.mp4
-rw-r--r-- 1 lukas staff 1449750 23 Apr 10:00 compact_monitor_2_1776927621638.mp4
-rw-r--r-- 1 lukas staff 1635019 23 Apr 10:05 compact_monitor_2_1776927933130.mp4
-rw-r--r-- 1 lukas staff 595843 23 Apr 10:10 compact_monitor_2_1776928245303.mp4
-rw-r--r-- 1 lukas staff 531088 23 Apr 10:15 compact_monitor_2_1776928550520.mp4
-rw-r--r-- 1 lukas staff 846515 23 Apr 10:20 compact_monitor_2_1776928856922.mp4
-rw-r--r-- 1 lukas staff 904088 23 Apr 10:26 compact_monitor_2_1776929169922.mp4
-rw-r--r-- 1 lukas staff 786829 23 Apr 10:31 compact_monitor_2_1776929479675.mp4
-rw-r--r-- 1 lukas staff 729181 23 Apr 10:36 compact_monitor_2_1776929783409.mp4
-rw-r--r-- 1 lukas staff 1116843 23 Apr 10:41 compact_monitor_2_1776930090240.mp4
-rw-r--r-- 1 lukas staff 889822 23 Apr 10:46 compact_monitor_2_1776930393454.mp4
-rw-r--r-- 1 lukas staff 444250 23 Apr 10:51 compact_monitor_2_1776930697139.mp4
-rw-r--r-- 1 lukas staff 1024242 23 Apr 10:56 compact_monitor_2_1776931006436.mp4
-rw-r--r-- 1 lukas staff 1206096 23 Apr 11:01 compact_monitor_2_1776931316182.mp4
-rw-r--r-- 1 lukas staff 1249893 23 Apr 11:07 compact_monitor_2_1776931621999.mp4
-rw-r--r-- 1 lukas staff 401526 23 Apr 11:12 compact_monitor_2_1776931932870.mp4
-rw-r--r-- 1 lukas staff 982256 23 Apr 11:17 compact_monitor_2_1776932236802.mp4
-rw-r--r-- 1 lukas staff 1131582 23 Apr 11:22 compact_monitor_2_1776932542205.mp4
-rw-r--r-- 1 lukas staff 808822 23 Apr 11:27 compact_monitor_2_1776932849317.mp4
-rw-r--r-- 1 lukas staff 442538 23 Apr 11:32 compact_monitor_2_1776933176662.mp4
-rw-r--r-- 1 lukas staff 675274 23 Apr 11:38 compact_monitor_2_1776933495384.mp4
-rw-r--r-- 1 lukas staff 1534516 23 Apr 11:43 compact_monitor_2_1776933812317.mp4
-rw-r--r-- 1 lukas staff 1657590 23 Apr 11:49 compact_monitor_2_1776934138529.mp4
-rw-r--r-- 1 lukas staff 1222887 23 Apr 11:54 compact_monitor_2_1776934453154.mp4
-rw-r--r-- 1 lukas staff 1003999 23 Apr 11:59 compact_monitor_2_1776934756922.mp4
-rw-r--r-- 1 lukas staff 1168918 23 Apr 12:04 compact_monitor_2_1776935062292.mp4
-rw-r--r-- 1 lukas staff 5755378 23 Apr 12:25 compact_monitor_2_1776936297908.mp4
-rw-r--r-- 1 lukas staff 302577 23 Apr 12:25 compact_monitor_2_1776936305094.mp4
-rw-r--r-- 1 lukas staff 1710485 23 Apr 12:35 compact_monitor_2_1776936920837.mp4
-rw-r--r-- 1 lukas staff 2705135 23 Apr 12:40 compact_monitor_2_1776937228721.mp4
-rw-r--r-- 1 lukas staff 1751314 23 Apr 12:45 compact_monitor_2_1776937539934.mp4
-rw-r--r-- 1 lukas staff 924709 23 Apr 12:50 compact_monitor_2_1776937844858.mp4
-rw-r--r-- 1 lukas staff 1285623 23 Apr 12:55 compact_monitor_2_1776938151831.mp4
-rw-r--r-- 1 lukas staff 405857 23 Apr 13:01 compact_monitor_2_1776938461195.mp4
-rw-r--r-- 1 lukas staff 407926 23 Apr 13:06 compact_monitor_2_1776938770290.mp4
-rw-r--r-- 1 lukas staff 958635 23 Apr 13:11 compact_monitor_2_1776939080379.mp4
-rw-r--r-- 1 lukas staff 3622447 23 Apr 13:16 compact_monitor_2_1776939392822.mp4
-rw-r--r-- 1 lukas staff 1850262 23 Apr 13:21 compact_monitor_2_1776939708714.mp4
-rw-r--r-- 1 lukas staff 4725657 23 Apr 13:26 compact_monitor_2_1776940013773.mp4
-rw-r--r-- 1 lukas staff 3590913 23 Apr 13:32 compact_monitor_2_1776940321454.mp4
-rw-r--r-- 1 lukas staff 4073703 23 Apr 13:37 compact_monitor_2_1776940630759.mp4
-rw-r--r-- 1 lukas staff 6432165 23 Apr 13:42 compact_monitor_2_1776940943551.mp4
-rw-r--r-- 1 lukas staff 1484957 23 Apr 13:47 compact_monitor_2_1776941250256.mp4
-rw-r--r-- 1 lukas staff 1336470 23 Apr 13:52 compact_monitor_2_1776941561295.mp4
-rw-r--r-- 1 lukas staff 1327781 23 Apr 13:57 compact_monitor_2_1776941869906.mp4
-rw-r--r-- 1 lukas staff 4219671 24 Apr 09:20 compact_monitor_2_1777011640295.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-23 $ cd 2026-04-23
cd: no such file or directory: 2026-04-23
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-23 $ ll
total 338296
drwxr-xr-x 106 lukas staff 3392 24 Apr 09:20 .
drwxr-xr-x 17 lukas staff 544 24 Apr 09:19 ..
-rw-r--r-- 1 lukas staff 174550 23 Apr 11:38 1776933481776_m1.jpg
-rw-r--r-- 1 lukas staff 1448572 23 Apr 09:24 compact_monitor_1_1776925466477.mp4
-rw-r--r-- 1 lukas staff 2157204 23 Apr 09:29 compact_monitor_1_1776925771961.mp4
-rw-r--r-- 1 lukas staff 785851 23 Apr 09:34 compact_monitor_1_1776926078542.mp4
-rw-r--r-- 1 lukas staff 319924 23 Apr 09:39 compact_monitor_1_1776926389122.mp4
-rw-r--r-- 1 lukas staff 178437 23 Apr 09:44 compact_monitor_1_1776926696343.mp4
-rw-r--r-- 1 lukas staff 182316 23 Apr 09:50 compact_monitor_1_1776927001989.mp4
-rw-r--r-- 1 lukas staff 475405 23 Apr 09:55 compact_monitor_1_1776927311821.mp4
-rw-r--r-- 1 lukas staff 3670216 23 Apr 10:00 compact_monitor_1_1776927616817.mp4
-rw-r--r-- 1 lukas staff 1311845 23 Apr 10:05 compact_monitor_1_1776927930717.mp4
-rw-r--r-- 1 lukas staff 1768745 23 Apr 10:10 compact_monitor_1_1776928242002.mp4
-rw-r--r-- 1 lukas staff 942473 23 Apr 10:15 compact_monitor_1_1776928549085.mp4
-rw-r--r-- 1 lukas staff 911130 23 Apr 10:20 compact_monitor_1_1776928854473.mp4
-rw-r--r-- 1 lukas staff 1249531 23 Apr 10:26 compact_monitor_1_1776929165912.mp4
-rw-r--r-- 1 lukas staff 2106654 23 Apr 10:31 compact_monitor_1_1776929476115.mp4
-rw-r--r-- 1 lukas staff 1633583 23 Apr 10:36 compact_monitor_1_1776929781778.mp4
-rw-r--r-- 1 lukas staff 1186578 23 Apr 10:41 compact_monitor_1_1776930087801.mp4
-rw-r--r-- 1 lukas staff 322993 23 Apr 10:46 compact_monitor_1_1776930392335.mp4
-rw-r--r-- 1 lukas staff 120434 23 Apr 10:51 compact_monitor_1_1776930696294.mp4
-rw-r--r-- 1 lukas staff 111489 23 Apr 10:56 compact_monitor_1_1776931004441.mp4
-rw-r--r-- 1 lukas staff 560588 23 Apr 11:01 compact_monitor_1_1776931314879.mp4
-rw-r--r-- 1 lukas staff 2146373 23 Apr 11:07 compact_monitor_1_1776931618003.mp4
-rw-r--r-- 1 lukas staff 1276021 23 Apr 11:12 compact_monitor_1_1776931930806.mp4
-rw-r--r-- 1 lukas staff 274120 23 Apr 11:17 compact_monitor_1_1776932235717.mp4
-rw-r--r-- 1 lukas staff 212162 23 Apr 11:22 compact_monitor_1_1776932541353.mp4
-rw-r--r-- 1 lukas staff 639071 23 Apr 11:27 compact_monitor_1_1776932847264.mp4
-rw-r--r-- 1 lukas staff 315645 23 Apr 11:32 compact_monitor_1_1776933174068.mp4
-rw-r--r-- 1 lukas staff 518635 23 Apr 11:38 compact_monitor_1_1776933492233.mp4
-rw-r--r-- 1 lukas staff 1886880 23 Apr 11:43 compact_monitor_1_1776933806263.mp4
-rw-r--r-- 1 lukas staff 2316900 23 Apr 11:48 compact_monitor_1_1776934133065.mp4
-rw-r--r-- 1 lukas staff 1589469 23 Apr 11:54 compact_monitor_1_1776934449640.mp4
-rw-r--r-- 1 lukas staff 592352 23 Apr 11:59 compact_monitor_1_1776934755385.mp4
-rw-r--r-- 1 lukas staff 1631938 23 Apr 12:04 compact_monitor_1_1776935058652.mp4
-rw-r--r-- 1 lukas staff 6099603 23 Apr 12:24 compact_monitor_1_1776936289062.mp4
-rw-r--r-- 1 lukas staff 91125 23 Apr 12:35 compact_monitor_1_1776936919782.mp4
-rw-r--r-- 1 lukas staff 2955581 23 Apr 12:40 compact_monitor_1_1776937224602.mp4
-rw-r--r-- 1 lukas staff 3002373 23 Apr 12:45 compact_monitor_1_1776937538337.mp4
-rw-r--r-- 1 lukas staff 3116117 23 Apr 12:50 compact_monitor_1_1776937842939.mp4
-rw-r--r-- 1 lukas staff 2426878 23 Apr 12:55 compact_monitor_1_1776938150380.mp4
-rw-r--r-- 1 lukas staff 2028056 23 Apr 13:01 compact_monitor_1_1776938459676.mp4
-rw-r--r-- 1 lukas staff 2104678 23 Apr 13:06 compact_monitor_1_1776938769006.mp4
-rw-r--r-- 1 lukas staff 3004512 23 Apr 13:11 compact_monitor_1_1776939078771.mp4
-rw-r--r-- 1 lukas staff 1643140 23 Apr 13:16 compact_monitor_1_1776939389326.mp4
-rw-r--r-- 1 lukas staff 1923058 23 Apr 13:21 compact_monitor_1_1776939706398.mp4
-rw-r--r-- 1 lukas staff 900757 23 Apr 13:26 compact_monitor_1_1776940011813.mp4
-rw-r--r-- 1 lukas staff 2964075 23 Apr 13:32 compact_monitor_1_1776940319106.mp4
-rw-r--r-- 1 lukas staff 2419466 23 Apr 13:37 compact_monitor_1_1776940628353.mp4
-rw-r--r-- 1 lukas staff 2447997 23 Apr 13:42 compact_monitor_1_1776940941730.mp4
-rw-r--r-- 1 lukas staff 2202220 23 Apr 13:47 compact_monitor_1_1776941248366.mp4
-rw-r--r-- 1 lukas staff 2309716 23 Apr 13:52 compact_monitor_1_1776941558220.mp4
-rw-r--r-- 1 lukas staff 2049791 23 Apr 13:57 compact_monitor_1_1776941868192.mp4
-rw-r--r-- 1 lukas staff 6097615 24 Apr 09:20 compact_monitor_1_1777011631828.mp4
-rw-r--r-- 1 lukas staff 215938 23 Apr 09:24 compact_monitor_2_1776925467316.mp4
-rw-r--r-- 1 lukas staff 3956084 23 Apr 09:29 compact_monitor_2_1776925774333.mp4
-rw-r--r-- 1 lukas staff 3998164 23 Apr 09:34 compact_monitor_2_1776926081685.mp4
-rw-r--r-- 1 lukas staff 2446471 23 Apr 09:39 compact_monitor_2_1776926391115.mp4
-rw-r--r-- 1 lukas staff 776043 23 Apr 09:44 compact_monitor_2_1776926697217.mp4
-rw-r--r-- 1 lukas staff 802594 23 Apr 09:50 compact_monitor_2_1776927003100.mp4
-rw-r--r-- 1 lukas staff 1453164 23 Apr 09:55 compact_monitor_2_1776927313533.mp4
-rw-r--r-- 1 lukas staff 1449750 23 Apr 10:00 compact_monitor_2_1776927621638.mp4
-rw-r--r-- 1 lukas staff 1635019 23 Apr 10:05 compact_monitor_2_1776927933130.mp4
-rw-r--r-- 1 lukas staff 595843 23 Apr 10:10 compact_monitor_2_1776928245303.mp4
-rw-r--r-- 1 lukas staff 531088 23 Apr 10:15 compact_monitor_2_1776928550520.mp4
-rw-r--r-- 1 lukas staff 846515 23 Apr 10:20 compact_monitor_2_1776928856922.mp4
-rw-r--r-- 1 lukas staff 904088 23 Apr 10:26 compact_monitor_2_1776929169922.mp4
-rw-r--r-- 1 lukas staff 786829 23 Apr 10:31 compact_monitor_2_1776929479675.mp4
-rw-r--r-- 1 lukas staff 729181 23 Apr 10:36 compact_monitor_2_1776929783409.mp4
-rw-r--r-- 1 lukas staff 1116843 23 Apr 10:41 compact_monitor_2_1776930090240.mp4
-rw-r--r-- 1 lukas staff 889822 23 Apr 10:46 compact_monitor_2_1776930393454.mp4
-rw-r--r-- 1 lukas staff 444250 23 Apr 10:51 compact_monitor_2_1776930697139.mp4
-rw-r--r-- 1 lukas staff 1024242 23 Apr 10:56 compact_monitor_2_1776931006436.mp4
-rw-r--r-- 1 lukas staff 1206096 23 Apr 11:01 compact_monitor_2_1776931316182.mp4
-rw-r--r-- 1 lukas staff 1249893 23 Apr 11:07 compact_monitor_2_1776931621999.mp4
-rw-r--r-- 1 lukas staff 401526 23 Apr 11:12 compact_monitor_2_1776931932870.mp4
-rw-r--r-- 1 lukas staff 982256 23 Apr 11:17 compact_monitor_2_1776932236802.mp4
-rw-r--r-- 1 lukas staff 1131582 23 Apr 11:22 compact_monitor_2_1776932542205.mp4
-rw-r--r-- 1 lukas staff 808822 23 Apr 11:27 compact_monitor_2_1776932849317.mp4
-rw-r--r-- 1 lukas staff 442538 23 Apr 11:32 compact_monitor_2_1776933176662.mp4
-rw-r--r-- 1 lukas staff 675274 23 Apr 11:38 compact_monitor_2_1776933495384.mp4
-rw-r--r-- 1 lukas staff 1534516 23 Apr 11:43 compact_monitor_2_1776933812317.mp4
-rw-r--r-- 1 lukas staff 1657590 23 Apr 11:49 compact_monitor_2_1776934138529.mp4
-rw-r--r-- 1 lukas staff 1222887 23 Apr 11:54 compact_monitor_2_1776934453154.mp4
-rw-r--r-- 1 lukas staff 1003999 23 Apr 11:59 compact_monitor_2_1776934756922.mp4
-rw-r--r-- 1 lukas staff 1168918 23 Apr 12:04 compact_monitor_2_1776935062292.mp4
-rw-r--r-- 1 lukas staff 5755378 23 Apr 12:25 compact_monitor_2_1776936297908.mp4
-rw-r--r-- 1 lukas staff 302577 23 Apr 12:25 compact_monitor_2_1776936305094.mp4
-rw-r--r-- 1 lukas staff 1710485 23 Apr 12:35 compact_monitor_2_1776936920837.mp4
-rw-r--r-- 1 lukas staff 2705135 23 Apr 12:40 compact_monitor_2_1776937228721.mp4
-rw-r--r-- 1 lukas staff 1751314 23 Apr 12:45 compact_monitor_2_1776937539934.mp4
-rw-r--r-- 1 lukas staff 924709 23 Apr 12:50 compact_monitor_2_1776937844858.mp4
-rw-r--r-- 1 lukas staff 1285623 23 Apr 12:55 compact_monitor_2_1776938151831.mp4
-rw-r--r-- 1 lukas staff 405857 23 Apr 13:01 compact_monitor_2_1776938461195.mp4
-rw-r--r-- 1 lukas staff 407926 23 Apr 13:06 compact_monitor_2_1776938770290.mp4
-rw-r--r-- 1 lukas staff 958635 23 Apr 13:11 compact_monitor_2_1776939080379.mp4
-rw-r--r-- 1 lukas staff 3622447 23 Apr 13:16 compact_monitor_2_1776939392822.mp4
-rw-r--r-- 1 lukas staff 1850262 23 Apr 13:21 compact_monitor_2_1776939708714.mp4
-rw-r--r-- 1 lukas staff 4725657 23 Apr 13:26 compact_monitor_2_1776940013773.mp4
-rw-r--r-- 1 lukas staff 3590913 23 Apr 13:32 compact_monitor_2_1776940321454.mp4
-rw-r--r-- 1 lukas staff 4073703 23 Apr 13:37 compact_monitor_2_1776940630759.mp4
-rw-r--r-- 1 lukas staff 6432165 23 Apr 13:42 compact_monitor_2_1776940943551.mp4
-rw-r--r-- 1 lukas staff 1484957 23 Apr 13:47 compact_monitor_2_1776941250256.mp4
-rw-r--r-- 1 lukas staff 1336470 23 Apr 13:52 compact_monitor_2_1776941561295.mp4
-rw-r--r-- 1 lukas staff 1327781 23 Apr 13:57 compact_monitor_2_1776941869906.mp4
-rw-r--r-- 1 lukas staff 4219671 24 Apr 09:20 compact_monitor_2_1777011640295.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-23 $ ~/.screenpipe/screenpipe_sync.sh 2026-04-23
[2026-04-24 09:31:53] ========================================
[2026-04-24 09:31:53] Screenpipe sync starting for: 2026-04-23
[2026-04-24 09:31:53] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK (6.8G)
[2026-04-24 09:31:53] ERROR: NAS not mounted at /Volumes/Test/screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-23 $ ~/.screenpipe/screenpipe_sync.sh 2026-04-23
[2026-04-24 09:32:09] ========================================
[2026-04-24 09:32:09] Screenpipe sync starting for: 2026-04-23
[2026-04-24 09:32:09] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK (6.8G)
NAS mount: OK /Volumes/Test/screenpipe
Archive DB: exists (5.8G)
Data dir: OK (104 files, 165M)
[+00m01s] ▶ Counting source rows for 2026-04-23
frames: 2564
elements: 208937
ui_events: 3546
ocr_text: 904
meetings: 2
[+00m01s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m01s
creating indexes ⠋
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
screenpipe"
Close Tab
sleep
Close Tab
⌥⌘1
sleep...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Thu Apr 23 14:01:29 on ttys009\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe/data/data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-04-23\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-23 $ ll\ntotal 338296\ndrwxr-xr-x 106 lukas staff 3392 24 Apr 09:20 .\ndrwxr-xr-x 17 lukas staff 544 24 Apr 09:19 ..\n-rw-r--r-- 1 lukas staff 174550 23 Apr 11:38 1776933481776_m1.jpg\n-rw-r--r-- 1 lukas staff 1448572 23 Apr 09:24 compact_monitor_1_1776925466477.mp4\n-rw-r--r-- 1 lukas staff 2157204 23 Apr 09:29 compact_monitor_1_1776925771961.mp4\n-rw-r--r-- 1 lukas staff 785851 23 Apr 09:34 compact_monitor_1_1776926078542.mp4\n-rw-r--r-- 1 lukas staff 319924 23 Apr 09:39 compact_monitor_1_1776926389122.mp4\n-rw-r--r-- 1 lukas staff 178437 23 Apr 09:44 compact_monitor_1_1776926696343.mp4\n-rw-r--r-- 1 lukas staff 182316 23 Apr 09:50 compact_monitor_1_1776927001989.mp4\n-rw-r--r-- 1 lukas staff 475405 23 Apr 09:55 compact_monitor_1_1776927311821.mp4\n-rw-r--r-- 1 lukas staff 3670216 23 Apr 10:00 compact_monitor_1_1776927616817.mp4\n-rw-r--r-- 1 lukas staff 1311845 23 Apr 10:05 compact_monitor_1_1776927930717.mp4\n-rw-r--r-- 1 lukas staff 1768745 23 Apr 10:10 compact_monitor_1_1776928242002.mp4\n-rw-r--r-- 1 lukas staff 942473 23 Apr 10:15 compact_monitor_1_1776928549085.mp4\n-rw-r--r-- 1 lukas staff 911130 23 Apr 10:20 compact_monitor_1_1776928854473.mp4\n-rw-r--r-- 1 lukas staff 1249531 23 Apr 10:26 compact_monitor_1_1776929165912.mp4\n-rw-r--r-- 1 lukas staff 2106654 23 Apr 10:31 compact_monitor_1_1776929476115.mp4\n-rw-r--r-- 1 lukas staff 1633583 23 Apr 10:36 compact_monitor_1_1776929781778.mp4\n-rw-r--r-- 1 lukas staff 1186578 23 Apr 10:41 compact_monitor_1_1776930087801.mp4\n-rw-r--r-- 1 lukas staff 322993 23 Apr 10:46 compact_monitor_1_1776930392335.mp4\n-rw-r--r-- 1 lukas staff 120434 23 Apr 10:51 compact_monitor_1_1776930696294.mp4\n-rw-r--r-- 1 lukas staff 111489 23 Apr 10:56 compact_monitor_1_1776931004441.mp4\n-rw-r--r-- 1 lukas staff 560588 23 Apr 11:01 compact_monitor_1_1776931314879.mp4\n-rw-r--r-- 1 lukas staff 2146373 23 Apr 11:07 compact_monitor_1_1776931618003.mp4\n-rw-r--r-- 1 lukas staff 1276021 23 Apr 11:12 compact_monitor_1_1776931930806.mp4\n-rw-r--r-- 1 lukas staff 274120 23 Apr 11:17 compact_monitor_1_1776932235717.mp4\n-rw-r--r-- 1 lukas staff 212162 23 Apr 11:22 compact_monitor_1_1776932541353.mp4\n-rw-r--r-- 1 lukas staff 639071 23 Apr 11:27 compact_monitor_1_1776932847264.mp4\n-rw-r--r-- 1 lukas staff 315645 23 Apr 11:32 compact_monitor_1_1776933174068.mp4\n-rw-r--r-- 1 lukas staff 518635 23 Apr 11:38 compact_monitor_1_1776933492233.mp4\n-rw-r--r-- 1 lukas staff 1886880 23 Apr 11:43 compact_monitor_1_1776933806263.mp4\n-rw-r--r-- 1 lukas staff 2316900 23 Apr 11:48 compact_monitor_1_1776934133065.mp4\n-rw-r--r-- 1 lukas staff 1589469 23 Apr 11:54 compact_monitor_1_1776934449640.mp4\n-rw-r--r-- 1 lukas staff 592352 23 Apr 11:59 compact_monitor_1_1776934755385.mp4\n-rw-r--r-- 1 lukas staff 1631938 23 Apr 12:04 compact_monitor_1_1776935058652.mp4\n-rw-r--r-- 1 lukas staff 6099603 23 Apr 12:24 compact_monitor_1_1776936289062.mp4\n-rw-r--r-- 1 lukas staff 91125 23 Apr 12:35 compact_monitor_1_1776936919782.mp4\n-rw-r--r-- 1 lukas staff 2955581 23 Apr 12:40 compact_monitor_1_1776937224602.mp4\n-rw-r--r-- 1 lukas staff 3002373 23 Apr 12:45 compact_monitor_1_1776937538337.mp4\n-rw-r--r-- 1 lukas staff 3116117 23 Apr 12:50 compact_monitor_1_1776937842939.mp4\n-rw-r--r-- 1 lukas staff 2426878 23 Apr 12:55 compact_monitor_1_1776938150380.mp4\n-rw-r--r-- 1 lukas staff 2028056 23 Apr 13:01 compact_monitor_1_1776938459676.mp4\n-rw-r--r-- 1 lukas staff 2104678 23 Apr 13:06 compact_monitor_1_1776938769006.mp4\n-rw-r--r-- 1 lukas staff 3004512 23 Apr 13:11 compact_monitor_1_1776939078771.mp4\n-rw-r--r-- 1 lukas staff 1643140 23 Apr 13:16 compact_monitor_1_1776939389326.mp4\n-rw-r--r-- 1 lukas staff 1923058 23 Apr 13:21 compact_monitor_1_1776939706398.mp4\n-rw-r--r-- 1 lukas staff 900757 23 Apr 13:26 compact_monitor_1_1776940011813.mp4\n-rw-r--r-- 1 lukas staff 2964075 23 Apr 13:32 compact_monitor_1_1776940319106.mp4\n-rw-r--r-- 1 lukas staff 2419466 23 Apr 13:37 compact_monitor_1_1776940628353.mp4\n-rw-r--r-- 1 lukas staff 2447997 23 Apr 13:42 compact_monitor_1_1776940941730.mp4\n-rw-r--r-- 1 lukas staff 2202220 23 Apr 13:47 compact_monitor_1_1776941248366.mp4\n-rw-r--r-- 1 lukas staff 2309716 23 Apr 13:52 compact_monitor_1_1776941558220.mp4\n-rw-r--r-- 1 lukas staff 2049791 23 Apr 13:57 compact_monitor_1_1776941868192.mp4\n-rw-r--r-- 1 lukas staff 6097615 24 Apr 09:20 compact_monitor_1_1777011631828.mp4\n-rw-r--r-- 1 lukas staff 215938 23 Apr 09:24 compact_monitor_2_1776925467316.mp4\n-rw-r--r-- 1 lukas staff 3956084 23 Apr 09:29 compact_monitor_2_1776925774333.mp4\n-rw-r--r-- 1 lukas staff 3998164 23 Apr 09:34 compact_monitor_2_1776926081685.mp4\n-rw-r--r-- 1 lukas staff 2446471 23 Apr 09:39 compact_monitor_2_1776926391115.mp4\n-rw-r--r-- 1 lukas staff 776043 23 Apr 09:44 compact_monitor_2_1776926697217.mp4\n-rw-r--r-- 1 lukas staff 802594 23 Apr 09:50 compact_monitor_2_1776927003100.mp4\n-rw-r--r-- 1 lukas staff 1453164 23 Apr 09:55 compact_monitor_2_1776927313533.mp4\n-rw-r--r-- 1 lukas staff 1449750 23 Apr 10:00 compact_monitor_2_1776927621638.mp4\n-rw-r--r-- 1 lukas staff 1635019 23 Apr 10:05 compact_monitor_2_1776927933130.mp4\n-rw-r--r-- 1 lukas staff 595843 23 Apr 10:10 compact_monitor_2_1776928245303.mp4\n-rw-r--r-- 1 lukas staff 531088 23 Apr 10:15 compact_monitor_2_1776928550520.mp4\n-rw-r--r-- 1 lukas staff 846515 23 Apr 10:20 compact_monitor_2_1776928856922.mp4\n-rw-r--r-- 1 lukas staff 904088 23 Apr 10:26 compact_monitor_2_1776929169922.mp4\n-rw-r--r-- 1 lukas staff 786829 23 Apr 10:31 compact_monitor_2_1776929479675.mp4\n-rw-r--r-- 1 lukas staff 729181 23 Apr 10:36 compact_monitor_2_1776929783409.mp4\n-rw-r--r-- 1 lukas staff 1116843 23 Apr 10:41 compact_monitor_2_1776930090240.mp4\n-rw-r--r-- 1 lukas staff 889822 23 Apr 10:46 compact_monitor_2_1776930393454.mp4\n-rw-r--r-- 1 lukas staff 444250 23 Apr 10:51 compact_monitor_2_1776930697139.mp4\n-rw-r--r-- 1 lukas staff 1024242 23 Apr 10:56 compact_monitor_2_1776931006436.mp4\n-rw-r--r-- 1 lukas staff 1206096 23 Apr 11:01 compact_monitor_2_1776931316182.mp4\n-rw-r--r-- 1 lukas staff 1249893 23 Apr 11:07 compact_monitor_2_1776931621999.mp4\n-rw-r--r-- 1 lukas staff 401526 23 Apr 11:12 compact_monitor_2_1776931932870.mp4\n-rw-r--r-- 1 lukas staff 982256 23 Apr 11:17 compact_monitor_2_1776932236802.mp4\n-rw-r--r-- 1 lukas staff 1131582 23 Apr 11:22 compact_monitor_2_1776932542205.mp4\n-rw-r--r-- 1 lukas staff 808822 23 Apr 11:27 compact_monitor_2_1776932849317.mp4\n-rw-r--r-- 1 lukas staff 442538 23 Apr 11:32 compact_monitor_2_1776933176662.mp4\n-rw-r--r-- 1 lukas staff 675274 23 Apr 11:38 compact_monitor_2_1776933495384.mp4\n-rw-r--r-- 1 lukas staff 1534516 23 Apr 11:43 compact_monitor_2_1776933812317.mp4\n-rw-r--r-- 1 lukas staff 1657590 23 Apr 11:49 compact_monitor_2_1776934138529.mp4\n-rw-r--r-- 1 lukas staff 1222887 23 Apr 11:54 compact_monitor_2_1776934453154.mp4\n-rw-r--r-- 1 lukas staff 1003999 23 Apr 11:59 compact_monitor_2_1776934756922.mp4\n-rw-r--r-- 1 lukas staff 1168918 23 Apr 12:04 compact_monitor_2_1776935062292.mp4\n-rw-r--r-- 1 lukas staff 5755378 23 Apr 12:25 compact_monitor_2_1776936297908.mp4\n-rw-r--r-- 1 lukas staff 302577 23 Apr 12:25 compact_monitor_2_1776936305094.mp4\n-rw-r--r-- 1 lukas staff 1710485 23 Apr 12:35 compact_monitor_2_1776936920837.mp4\n-rw-r--r-- 1 lukas staff 2705135 23 Apr 12:40 compact_monitor_2_1776937228721.mp4\n-rw-r--r-- 1 lukas staff 1751314 23 Apr 12:45 compact_monitor_2_1776937539934.mp4\n-rw-r--r-- 1 lukas staff 924709 23 Apr 12:50 compact_monitor_2_1776937844858.mp4\n-rw-r--r-- 1 lukas staff 1285623 23 Apr 12:55 compact_monitor_2_1776938151831.mp4\n-rw-r--r-- 1 lukas staff 405857 23 Apr 13:01 compact_monitor_2_1776938461195.mp4\n-rw-r--r-- 1 lukas staff 407926 23 Apr 13:06 compact_monitor_2_1776938770290.mp4\n-rw-r--r-- 1 lukas staff 958635 23 Apr 13:11 compact_monitor_2_1776939080379.mp4\n-rw-r--r-- 1 lukas staff 3622447 23 Apr 13:16 compact_monitor_2_1776939392822.mp4\n-rw-r--r-- 1 lukas staff 1850262 23 Apr 13:21 compact_monitor_2_1776939708714.mp4\n-rw-r--r-- 1 lukas staff 4725657 23 Apr 13:26 compact_monitor_2_1776940013773.mp4\n-rw-r--r-- 1 lukas staff 3590913 23 Apr 13:32 compact_monitor_2_1776940321454.mp4\n-rw-r--r-- 1 lukas staff 4073703 23 Apr 13:37 compact_monitor_2_1776940630759.mp4\n-rw-r--r-- 1 lukas staff 6432165 23 Apr 13:42 compact_monitor_2_1776940943551.mp4\n-rw-r--r-- 1 lukas staff 1484957 23 Apr 13:47 compact_monitor_2_1776941250256.mp4\n-rw-r--r-- 1 lukas staff 1336470 23 Apr 13:52 compact_monitor_2_1776941561295.mp4\n-rw-r--r-- 1 lukas staff 1327781 23 Apr 13:57 compact_monitor_2_1776941869906.mp4\n-rw-r--r-- 1 lukas staff 4219671 24 Apr 09:20 compact_monitor_2_1777011640295.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-23 $ cd 2026-04-23\ncd: no such file or directory: 2026-04-23\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-23 $ ll\ntotal 338296\ndrwxr-xr-x 106 lukas staff 3392 24 Apr 09:20 .\ndrwxr-xr-x 17 lukas staff 544 24 Apr 09:19 ..\n-rw-r--r-- 1 lukas staff 174550 23 Apr 11:38 1776933481776_m1.jpg\n-rw-r--r-- 1 lukas staff 1448572 23 Apr 09:24 compact_monitor_1_1776925466477.mp4\n-rw-r--r-- 1 lukas staff 2157204 23 Apr 09:29 compact_monitor_1_1776925771961.mp4\n-rw-r--r-- 1 lukas staff 785851 23 Apr 09:34 compact_monitor_1_1776926078542.mp4\n-rw-r--r-- 1 lukas staff 319924 23 Apr 09:39 compact_monitor_1_1776926389122.mp4\n-rw-r--r-- 1 lukas staff 178437 23 Apr 09:44 compact_monitor_1_1776926696343.mp4\n-rw-r--r-- 1 lukas staff 182316 23 Apr 09:50 compact_monitor_1_1776927001989.mp4\n-rw-r--r-- 1 lukas staff 475405 23 Apr 09:55 compact_monitor_1_1776927311821.mp4\n-rw-r--r-- 1 lukas staff 3670216 23 Apr 10:00 compact_monitor_1_1776927616817.mp4\n-rw-r--r-- 1 lukas staff 1311845 23 Apr 10:05 compact_monitor_1_1776927930717.mp4\n-rw-r--r-- 1 lukas staff 1768745 23 Apr 10:10 compact_monitor_1_1776928242002.mp4\n-rw-r--r-- 1 lukas staff 942473 23 Apr 10:15 compact_monitor_1_1776928549085.mp4\n-rw-r--r-- 1 lukas staff 911130 23 Apr 10:20 compact_monitor_1_1776928854473.mp4\n-rw-r--r-- 1 lukas staff 1249531 23 Apr 10:26 compact_monitor_1_1776929165912.mp4\n-rw-r--r-- 1 lukas staff 2106654 23 Apr 10:31 compact_monitor_1_1776929476115.mp4\n-rw-r--r-- 1 lukas staff 1633583 23 Apr 10:36 compact_monitor_1_1776929781778.mp4\n-rw-r--r-- 1 lukas staff 1186578 23 Apr 10:41 compact_monitor_1_1776930087801.mp4\n-rw-r--r-- 1 lukas staff 322993 23 Apr 10:46 compact_monitor_1_1776930392335.mp4\n-rw-r--r-- 1 lukas staff 120434 23 Apr 10:51 compact_monitor_1_1776930696294.mp4\n-rw-r--r-- 1 lukas staff 111489 23 Apr 10:56 compact_monitor_1_1776931004441.mp4\n-rw-r--r-- 1 lukas staff 560588 23 Apr 11:01 compact_monitor_1_1776931314879.mp4\n-rw-r--r-- 1 lukas staff 2146373 23 Apr 11:07 compact_monitor_1_1776931618003.mp4\n-rw-r--r-- 1 lukas staff 1276021 23 Apr 11:12 compact_monitor_1_1776931930806.mp4\n-rw-r--r-- 1 lukas staff 274120 23 Apr 11:17 compact_monitor_1_1776932235717.mp4\n-rw-r--r-- 1 lukas staff 212162 23 Apr 11:22 compact_monitor_1_1776932541353.mp4\n-rw-r--r-- 1 lukas staff 639071 23 Apr 11:27 compact_monitor_1_1776932847264.mp4\n-rw-r--r-- 1 lukas staff 315645 23 Apr 11:32 compact_monitor_1_1776933174068.mp4\n-rw-r--r-- 1 lukas staff 518635 23 Apr 11:38 compact_monitor_1_1776933492233.mp4\n-rw-r--r-- 1 lukas staff 1886880 23 Apr 11:43 compact_monitor_1_1776933806263.mp4\n-rw-r--r-- 1 lukas staff 2316900 23 Apr 11:48 compact_monitor_1_1776934133065.mp4\n-rw-r--r-- 1 lukas staff 1589469 23 Apr 11:54 compact_monitor_1_1776934449640.mp4\n-rw-r--r-- 1 lukas staff 592352 23 Apr 11:59 compact_monitor_1_1776934755385.mp4\n-rw-r--r-- 1 lukas staff 1631938 23 Apr 12:04 compact_monitor_1_1776935058652.mp4\n-rw-r--r-- 1 lukas staff 6099603 23 Apr 12:24 compact_monitor_1_1776936289062.mp4\n-rw-r--r-- 1 lukas staff 91125 23 Apr 12:35 compact_monitor_1_1776936919782.mp4\n-rw-r--r-- 1 lukas staff 2955581 23 Apr 12:40 compact_monitor_1_1776937224602.mp4\n-rw-r--r-- 1 lukas staff 3002373 23 Apr 12:45 compact_monitor_1_1776937538337.mp4\n-rw-r--r-- 1 lukas staff 3116117 23 Apr 12:50 compact_monitor_1_1776937842939.mp4\n-rw-r--r-- 1 lukas staff 2426878 23 Apr 12:55 compact_monitor_1_1776938150380.mp4\n-rw-r--r-- 1 lukas staff 2028056 23 Apr 13:01 compact_monitor_1_1776938459676.mp4\n-rw-r--r-- 1 lukas staff 2104678 23 Apr 13:06 compact_monitor_1_1776938769006.mp4\n-rw-r--r-- 1 lukas staff 3004512 23 Apr 13:11 compact_monitor_1_1776939078771.mp4\n-rw-r--r-- 1 lukas staff 1643140 23 Apr 13:16 compact_monitor_1_1776939389326.mp4\n-rw-r--r-- 1 lukas staff 1923058 23 Apr 13:21 compact_monitor_1_1776939706398.mp4\n-rw-r--r-- 1 lukas staff 900757 23 Apr 13:26 compact_monitor_1_1776940011813.mp4\n-rw-r--r-- 1 lukas staff 2964075 23 Apr 13:32 compact_monitor_1_1776940319106.mp4\n-rw-r--r-- 1 lukas staff 2419466 23 Apr 13:37 compact_monitor_1_1776940628353.mp4\n-rw-r--r-- 1 lukas staff 2447997 23 Apr 13:42 compact_monitor_1_1776940941730.mp4\n-rw-r--r-- 1 lukas staff 2202220 23 Apr 13:47 compact_monitor_1_1776941248366.mp4\n-rw-r--r-- 1 lukas staff 2309716 23 Apr 13:52 compact_monitor_1_1776941558220.mp4\n-rw-r--r-- 1 lukas staff 2049791 23 Apr 13:57 compact_monitor_1_1776941868192.mp4\n-rw-r--r-- 1 lukas staff 6097615 24 Apr 09:20 compact_monitor_1_1777011631828.mp4\n-rw-r--r-- 1 lukas staff 215938 23 Apr 09:24 compact_monitor_2_1776925467316.mp4\n-rw-r--r-- 1 lukas staff 3956084 23 Apr 09:29 compact_monitor_2_1776925774333.mp4\n-rw-r--r-- 1 lukas staff 3998164 23 Apr 09:34 compact_monitor_2_1776926081685.mp4\n-rw-r--r-- 1 lukas staff 2446471 23 Apr 09:39 compact_monitor_2_1776926391115.mp4\n-rw-r--r-- 1 lukas staff 776043 23 Apr 09:44 compact_monitor_2_1776926697217.mp4\n-rw-r--r-- 1 lukas staff 802594 23 Apr 09:50 compact_monitor_2_1776927003100.mp4\n-rw-r--r-- 1 lukas staff 1453164 23 Apr 09:55 compact_monitor_2_1776927313533.mp4\n-rw-r--r-- 1 lukas staff 1449750 23 Apr 10:00 compact_monitor_2_1776927621638.mp4\n-rw-r--r-- 1 lukas staff 1635019 23 Apr 10:05 compact_monitor_2_1776927933130.mp4\n-rw-r--r-- 1 lukas staff 595843 23 Apr 10:10 compact_monitor_2_1776928245303.mp4\n-rw-r--r-- 1 lukas staff 531088 23 Apr 10:15 compact_monitor_2_1776928550520.mp4\n-rw-r--r-- 1 lukas staff 846515 23 Apr 10:20 compact_monitor_2_1776928856922.mp4\n-rw-r--r-- 1 lukas staff 904088 23 Apr 10:26 compact_monitor_2_1776929169922.mp4\n-rw-r--r-- 1 lukas staff 786829 23 Apr 10:31 compact_monitor_2_1776929479675.mp4\n-rw-r--r-- 1 lukas staff 729181 23 Apr 10:36 compact_monitor_2_1776929783409.mp4\n-rw-r--r-- 1 lukas staff 1116843 23 Apr 10:41 compact_monitor_2_1776930090240.mp4\n-rw-r--r-- 1 lukas staff 889822 23 Apr 10:46 compact_monitor_2_1776930393454.mp4\n-rw-r--r-- 1 lukas staff 444250 23 Apr 10:51 compact_monitor_2_1776930697139.mp4\n-rw-r--r-- 1 lukas staff 1024242 23 Apr 10:56 compact_monitor_2_1776931006436.mp4\n-rw-r--r-- 1 lukas staff 1206096 23 Apr 11:01 compact_monitor_2_1776931316182.mp4\n-rw-r--r-- 1 lukas staff 1249893 23 Apr 11:07 compact_monitor_2_1776931621999.mp4\n-rw-r--r-- 1 lukas staff 401526 23 Apr 11:12 compact_monitor_2_1776931932870.mp4\n-rw-r--r-- 1 lukas staff 982256 23 Apr 11:17 compact_monitor_2_1776932236802.mp4\n-rw-r--r-- 1 lukas staff 1131582 23 Apr 11:22 compact_monitor_2_1776932542205.mp4\n-rw-r--r-- 1 lukas staff 808822 23 Apr 11:27 compact_monitor_2_1776932849317.mp4\n-rw-r--r-- 1 lukas staff 442538 23 Apr 11:32 compact_monitor_2_1776933176662.mp4\n-rw-r--r-- 1 lukas staff 675274 23 Apr 11:38 compact_monitor_2_1776933495384.mp4\n-rw-r--r-- 1 lukas staff 1534516 23 Apr 11:43 compact_monitor_2_1776933812317.mp4\n-rw-r--r-- 1 lukas staff 1657590 23 Apr 11:49 compact_monitor_2_1776934138529.mp4\n-rw-r--r-- 1 lukas staff 1222887 23 Apr 11:54 compact_monitor_2_1776934453154.mp4\n-rw-r--r-- 1 lukas staff 1003999 23 Apr 11:59 compact_monitor_2_1776934756922.mp4\n-rw-r--r-- 1 lukas staff 1168918 23 Apr 12:04 compact_monitor_2_1776935062292.mp4\n-rw-r--r-- 1 lukas staff 5755378 23 Apr 12:25 compact_monitor_2_1776936297908.mp4\n-rw-r--r-- 1 lukas staff 302577 23 Apr 12:25 compact_monitor_2_1776936305094.mp4\n-rw-r--r-- 1 lukas staff 1710485 23 Apr 12:35 compact_monitor_2_1776936920837.mp4\n-rw-r--r-- 1 lukas staff 2705135 23 Apr 12:40 compact_monitor_2_1776937228721.mp4\n-rw-r--r-- 1 lukas staff 1751314 23 Apr 12:45 compact_monitor_2_1776937539934.mp4\n-rw-r--r-- 1 lukas staff 924709 23 Apr 12:50 compact_monitor_2_1776937844858.mp4\n-rw-r--r-- 1 lukas staff 1285623 23 Apr 12:55 compact_monitor_2_1776938151831.mp4\n-rw-r--r-- 1 lukas staff 405857 23 Apr 13:01 compact_monitor_2_1776938461195.mp4\n-rw-r--r-- 1 lukas staff 407926 23 Apr 13:06 compact_monitor_2_1776938770290.mp4\n-rw-r--r-- 1 lukas staff 958635 23 Apr 13:11 compact_monitor_2_1776939080379.mp4\n-rw-r--r-- 1 lukas staff 3622447 23 Apr 13:16 compact_monitor_2_1776939392822.mp4\n-rw-r--r-- 1 lukas staff 1850262 23 Apr 13:21 compact_monitor_2_1776939708714.mp4\n-rw-r--r-- 1 lukas staff 4725657 23 Apr 13:26 compact_monitor_2_1776940013773.mp4\n-rw-r--r-- 1 lukas staff 3590913 23 Apr 13:32 compact_monitor_2_1776940321454.mp4\n-rw-r--r-- 1 lukas staff 4073703 23 Apr 13:37 compact_monitor_2_1776940630759.mp4\n-rw-r--r-- 1 lukas staff 6432165 23 Apr 13:42 compact_monitor_2_1776940943551.mp4\n-rw-r--r-- 1 lukas staff 1484957 23 Apr 13:47 compact_monitor_2_1776941250256.mp4\n-rw-r--r-- 1 lukas staff 1336470 23 Apr 13:52 compact_monitor_2_1776941561295.mp4\n-rw-r--r-- 1 lukas staff 1327781 23 Apr 13:57 compact_monitor_2_1776941869906.mp4\n-rw-r--r-- 1 lukas staff 4219671 24 Apr 09:20 compact_monitor_2_1777011640295.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-23 $ ~/.screenpipe/screenpipe_sync.sh 2026-04-23\n[2026-04-24 09:31:53] ========================================\n[2026-04-24 09:31:53] Screenpipe sync starting for: 2026-04-23\n[2026-04-24 09:31:53] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK (6.8G)\n[2026-04-24 09:31:53] ERROR: NAS not mounted at /Volumes/Test/screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-23 $ ~/.screenpipe/screenpipe_sync.sh 2026-04-23\n[2026-04-24 09:32:09] ========================================\n[2026-04-24 09:32:09] Screenpipe sync starting for: 2026-04-23\n[2026-04-24 09:32:09] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK (6.8G)\n NAS mount: OK /Volumes/Test/screenpipe\n Archive DB: exists (5.8G)\n Data dir: OK (104 files, 165M)\n\n[+00m01s] ▶ Counting source rows for 2026-04-23\n frames: 2564\n elements: 208937\n ui_events: 3546\n ocr_text: 904\n meetings: 2\n\n[+00m01s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m01s\n creating indexes ⠋","depth":4,"value":"Last login: Thu Apr 23 14:01:29 on ttys009\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe/data/data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-04-23\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-23 $ ll\ntotal 338296\ndrwxr-xr-x 106 lukas staff 3392 24 Apr 09:20 .\ndrwxr-xr-x 17 lukas staff 544 24 Apr 09:19 ..\n-rw-r--r-- 1 lukas staff 174550 23 Apr 11:38 1776933481776_m1.jpg\n-rw-r--r-- 1 lukas staff 1448572 23 Apr 09:24 compact_monitor_1_1776925466477.mp4\n-rw-r--r-- 1 lukas staff 2157204 23 Apr 09:29 compact_monitor_1_1776925771961.mp4\n-rw-r--r-- 1 lukas staff 785851 23 Apr 09:34 compact_monitor_1_1776926078542.mp4\n-rw-r--r-- 1 lukas staff 319924 23 Apr 09:39 compact_monitor_1_1776926389122.mp4\n-rw-r--r-- 1 lukas staff 178437 23 Apr 09:44 compact_monitor_1_1776926696343.mp4\n-rw-r--r-- 1 lukas staff 182316 23 Apr 09:50 compact_monitor_1_1776927001989.mp4\n-rw-r--r-- 1 lukas staff 475405 23 Apr 09:55 compact_monitor_1_1776927311821.mp4\n-rw-r--r-- 1 lukas staff 3670216 23 Apr 10:00 compact_monitor_1_1776927616817.mp4\n-rw-r--r-- 1 lukas staff 1311845 23 Apr 10:05 compact_monitor_1_1776927930717.mp4\n-rw-r--r-- 1 lukas staff 1768745 23 Apr 10:10 compact_monitor_1_1776928242002.mp4\n-rw-r--r-- 1 lukas staff 942473 23 Apr 10:15 compact_monitor_1_1776928549085.mp4\n-rw-r--r-- 1 lukas staff 911130 23 Apr 10:20 compact_monitor_1_1776928854473.mp4\n-rw-r--r-- 1 lukas staff 1249531 23 Apr 10:26 compact_monitor_1_1776929165912.mp4\n-rw-r--r-- 1 lukas staff 2106654 23 Apr 10:31 compact_monitor_1_1776929476115.mp4\n-rw-r--r-- 1 lukas staff 1633583 23 Apr 10:36 compact_monitor_1_1776929781778.mp4\n-rw-r--r-- 1 lukas staff 1186578 23 Apr 10:41 compact_monitor_1_1776930087801.mp4\n-rw-r--r-- 1 lukas staff 322993 23 Apr 10:46 compact_monitor_1_1776930392335.mp4\n-rw-r--r-- 1 lukas staff 120434 23 Apr 10:51 compact_monitor_1_1776930696294.mp4\n-rw-r--r-- 1 lukas staff 111489 23 Apr 10:56 compact_monitor_1_1776931004441.mp4\n-rw-r--r-- 1 lukas staff 560588 23 Apr 11:01 compact_monitor_1_1776931314879.mp4\n-rw-r--r-- 1 lukas staff 2146373 23 Apr 11:07 compact_monitor_1_1776931618003.mp4\n-rw-r--r-- 1 lukas staff 1276021 23 Apr 11:12 compact_monitor_1_1776931930806.mp4\n-rw-r--r-- 1 lukas staff 274120 23 Apr 11:17 compact_monitor_1_1776932235717.mp4\n-rw-r--r-- 1 lukas staff 212162 23 Apr 11:22 compact_monitor_1_1776932541353.mp4\n-rw-r--r-- 1 lukas staff 639071 23 Apr 11:27 compact_monitor_1_1776932847264.mp4\n-rw-r--r-- 1 lukas staff 315645 23 Apr 11:32 compact_monitor_1_1776933174068.mp4\n-rw-r--r-- 1 lukas staff 518635 23 Apr 11:38 compact_monitor_1_1776933492233.mp4\n-rw-r--r-- 1 lukas staff 1886880 23 Apr 11:43 compact_monitor_1_1776933806263.mp4\n-rw-r--r-- 1 lukas staff 2316900 23 Apr 11:48 compact_monitor_1_1776934133065.mp4\n-rw-r--r-- 1 lukas staff 1589469 23 Apr 11:54 compact_monitor_1_1776934449640.mp4\n-rw-r--r-- 1 lukas staff 592352 23 Apr 11:59 compact_monitor_1_1776934755385.mp4\n-rw-r--r-- 1 lukas staff 1631938 23 Apr 12:04 compact_monitor_1_1776935058652.mp4\n-rw-r--r-- 1 lukas staff 6099603 23 Apr 12:24 compact_monitor_1_1776936289062.mp4\n-rw-r--r-- 1 lukas staff 91125 23 Apr 12:35 compact_monitor_1_1776936919782.mp4\n-rw-r--r-- 1 lukas staff 2955581 23 Apr 12:40 compact_monitor_1_1776937224602.mp4\n-rw-r--r-- 1 lukas staff 3002373 23 Apr 12:45 compact_monitor_1_1776937538337.mp4\n-rw-r--r-- 1 lukas staff 3116117 23 Apr 12:50 compact_monitor_1_1776937842939.mp4\n-rw-r--r-- 1 lukas staff 2426878 23 Apr 12:55 compact_monitor_1_1776938150380.mp4\n-rw-r--r-- 1 lukas staff 2028056 23 Apr 13:01 compact_monitor_1_1776938459676.mp4\n-rw-r--r-- 1 lukas staff 2104678 23 Apr 13:06 compact_monitor_1_1776938769006.mp4\n-rw-r--r-- 1 lukas staff 3004512 23 Apr 13:11 compact_monitor_1_1776939078771.mp4\n-rw-r--r-- 1 lukas staff 1643140 23 Apr 13:16 compact_monitor_1_1776939389326.mp4\n-rw-r--r-- 1 lukas staff 1923058 23 Apr 13:21 compact_monitor_1_1776939706398.mp4\n-rw-r--r-- 1 lukas staff 900757 23 Apr 13:26 compact_monitor_1_1776940011813.mp4\n-rw-r--r-- 1 lukas staff 2964075 23 Apr 13:32 compact_monitor_1_1776940319106.mp4\n-rw-r--r-- 1 lukas staff 2419466 23 Apr 13:37 compact_monitor_1_1776940628353.mp4\n-rw-r--r-- 1 lukas staff 2447997 23 Apr 13:42 compact_monitor_1_1776940941730.mp4\n-rw-r--r-- 1 lukas staff 2202220 23 Apr 13:47 compact_monitor_1_1776941248366.mp4\n-rw-r--r-- 1 lukas staff 2309716 23 Apr 13:52 compact_monitor_1_1776941558220.mp4\n-rw-r--r-- 1 lukas staff 2049791 23 Apr 13:57 compact_monitor_1_1776941868192.mp4\n-rw-r--r-- 1 lukas staff 6097615 24 Apr 09:20 compact_monitor_1_1777011631828.mp4\n-rw-r--r-- 1 lukas staff 215938 23 Apr 09:24 compact_monitor_2_1776925467316.mp4\n-rw-r--r-- 1 lukas staff 3956084 23 Apr 09:29 compact_monitor_2_1776925774333.mp4\n-rw-r--r-- 1 lukas staff 3998164 23 Apr 09:34 compact_monitor_2_1776926081685.mp4\n-rw-r--r-- 1 lukas staff 2446471 23 Apr 09:39 compact_monitor_2_1776926391115.mp4\n-rw-r--r-- 1 lukas staff 776043 23 Apr 09:44 compact_monitor_2_1776926697217.mp4\n-rw-r--r-- 1 lukas staff 802594 23 Apr 09:50 compact_monitor_2_1776927003100.mp4\n-rw-r--r-- 1 lukas staff 1453164 23 Apr 09:55 compact_monitor_2_1776927313533.mp4\n-rw-r--r-- 1 lukas staff 1449750 23 Apr 10:00 compact_monitor_2_1776927621638.mp4\n-rw-r--r-- 1 lukas staff 1635019 23 Apr 10:05 compact_monitor_2_1776927933130.mp4\n-rw-r--r-- 1 lukas staff 595843 23 Apr 10:10 compact_monitor_2_1776928245303.mp4\n-rw-r--r-- 1 lukas staff 531088 23 Apr 10:15 compact_monitor_2_1776928550520.mp4\n-rw-r--r-- 1 lukas staff 846515 23 Apr 10:20 compact_monitor_2_1776928856922.mp4\n-rw-r--r-- 1 lukas staff 904088 23 Apr 10:26 compact_monitor_2_1776929169922.mp4\n-rw-r--r-- 1 lukas staff 786829 23 Apr 10:31 compact_monitor_2_1776929479675.mp4\n-rw-r--r-- 1 lukas staff 729181 23 Apr 10:36 compact_monitor_2_1776929783409.mp4\n-rw-r--r-- 1 lukas staff 1116843 23 Apr 10:41 compact_monitor_2_1776930090240.mp4\n-rw-r--r-- 1 lukas staff 889822 23 Apr 10:46 compact_monitor_2_1776930393454.mp4\n-rw-r--r-- 1 lukas staff 444250 23 Apr 10:51 compact_monitor_2_1776930697139.mp4\n-rw-r--r-- 1 lukas staff 1024242 23 Apr 10:56 compact_monitor_2_1776931006436.mp4\n-rw-r--r-- 1 lukas staff 1206096 23 Apr 11:01 compact_monitor_2_1776931316182.mp4\n-rw-r--r-- 1 lukas staff 1249893 23 Apr 11:07 compact_monitor_2_1776931621999.mp4\n-rw-r--r-- 1 lukas staff 401526 23 Apr 11:12 compact_monitor_2_1776931932870.mp4\n-rw-r--r-- 1 lukas staff 982256 23 Apr 11:17 compact_monitor_2_1776932236802.mp4\n-rw-r--r-- 1 lukas staff 1131582 23 Apr 11:22 compact_monitor_2_1776932542205.mp4\n-rw-r--r-- 1 lukas staff 808822 23 Apr 11:27 compact_monitor_2_1776932849317.mp4\n-rw-r--r-- 1 lukas staff 442538 23 Apr 11:32 compact_monitor_2_1776933176662.mp4\n-rw-r--r-- 1 lukas staff 675274 23 Apr 11:38 compact_monitor_2_1776933495384.mp4\n-rw-r--r-- 1 lukas staff 1534516 23 Apr 11:43 compact_monitor_2_1776933812317.mp4\n-rw-r--r-- 1 lukas staff 1657590 23 Apr 11:49 compact_monitor_2_1776934138529.mp4\n-rw-r--r-- 1 lukas staff 1222887 23 Apr 11:54 compact_monitor_2_1776934453154.mp4\n-rw-r--r-- 1 lukas staff 1003999 23 Apr 11:59 compact_monitor_2_1776934756922.mp4\n-rw-r--r-- 1 lukas staff 1168918 23 Apr 12:04 compact_monitor_2_1776935062292.mp4\n-rw-r--r-- 1 lukas staff 5755378 23 Apr 12:25 compact_monitor_2_1776936297908.mp4\n-rw-r--r-- 1 lukas staff 302577 23 Apr 12:25 compact_monitor_2_1776936305094.mp4\n-rw-r--r-- 1 lukas staff 1710485 23 Apr 12:35 compact_monitor_2_1776936920837.mp4\n-rw-r--r-- 1 lukas staff 2705135 23 Apr 12:40 compact_monitor_2_1776937228721.mp4\n-rw-r--r-- 1 lukas staff 1751314 23 Apr 12:45 compact_monitor_2_1776937539934.mp4\n-rw-r--r-- 1 lukas staff 924709 23 Apr 12:50 compact_monitor_2_1776937844858.mp4\n-rw-r--r-- 1 lukas staff 1285623 23 Apr 12:55 compact_monitor_2_1776938151831.mp4\n-rw-r--r-- 1 lukas staff 405857 23 Apr 13:01 compact_monitor_2_1776938461195.mp4\n-rw-r--r-- 1 lukas staff 407926 23 Apr 13:06 compact_monitor_2_1776938770290.mp4\n-rw-r--r-- 1 lukas staff 958635 23 Apr 13:11 compact_monitor_2_1776939080379.mp4\n-rw-r--r-- 1 lukas staff 3622447 23 Apr 13:16 compact_monitor_2_1776939392822.mp4\n-rw-r--r-- 1 lukas staff 1850262 23 Apr 13:21 compact_monitor_2_1776939708714.mp4\n-rw-r--r-- 1 lukas staff 4725657 23 Apr 13:26 compact_monitor_2_1776940013773.mp4\n-rw-r--r-- 1 lukas staff 3590913 23 Apr 13:32 compact_monitor_2_1776940321454.mp4\n-rw-r--r-- 1 lukas staff 4073703 23 Apr 13:37 compact_monitor_2_1776940630759.mp4\n-rw-r--r-- 1 lukas staff 6432165 23 Apr 13:42 compact_monitor_2_1776940943551.mp4\n-rw-r--r-- 1 lukas staff 1484957 23 Apr 13:47 compact_monitor_2_1776941250256.mp4\n-rw-r--r-- 1 lukas staff 1336470 23 Apr 13:52 compact_monitor_2_1776941561295.mp4\n-rw-r--r-- 1 lukas staff 1327781 23 Apr 13:57 compact_monitor_2_1776941869906.mp4\n-rw-r--r-- 1 lukas staff 4219671 24 Apr 09:20 compact_monitor_2_1777011640295.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-23 $ cd 2026-04-23\ncd: no such file or directory: 2026-04-23\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-23 $ ll\ntotal 338296\ndrwxr-xr-x 106 lukas staff 3392 24 Apr 09:20 .\ndrwxr-xr-x 17 lukas staff 544 24 Apr 09:19 ..\n-rw-r--r-- 1 lukas staff 174550 23 Apr 11:38 1776933481776_m1.jpg\n-rw-r--r-- 1 lukas staff 1448572 23 Apr 09:24 compact_monitor_1_1776925466477.mp4\n-rw-r--r-- 1 lukas staff 2157204 23 Apr 09:29 compact_monitor_1_1776925771961.mp4\n-rw-r--r-- 1 lukas staff 785851 23 Apr 09:34 compact_monitor_1_1776926078542.mp4\n-rw-r--r-- 1 lukas staff 319924 23 Apr 09:39 compact_monitor_1_1776926389122.mp4\n-rw-r--r-- 1 lukas staff 178437 23 Apr 09:44 compact_monitor_1_1776926696343.mp4\n-rw-r--r-- 1 lukas staff 182316 23 Apr 09:50 compact_monitor_1_1776927001989.mp4\n-rw-r--r-- 1 lukas staff 475405 23 Apr 09:55 compact_monitor_1_1776927311821.mp4\n-rw-r--r-- 1 lukas staff 3670216 23 Apr 10:00 compact_monitor_1_1776927616817.mp4\n-rw-r--r-- 1 lukas staff 1311845 23 Apr 10:05 compact_monitor_1_1776927930717.mp4\n-rw-r--r-- 1 lukas staff 1768745 23 Apr 10:10 compact_monitor_1_1776928242002.mp4\n-rw-r--r-- 1 lukas staff 942473 23 Apr 10:15 compact_monitor_1_1776928549085.mp4\n-rw-r--r-- 1 lukas staff 911130 23 Apr 10:20 compact_monitor_1_1776928854473.mp4\n-rw-r--r-- 1 lukas staff 1249531 23 Apr 10:26 compact_monitor_1_1776929165912.mp4\n-rw-r--r-- 1 lukas staff 2106654 23 Apr 10:31 compact_monitor_1_1776929476115.mp4\n-rw-r--r-- 1 lukas staff 1633583 23 Apr 10:36 compact_monitor_1_1776929781778.mp4\n-rw-r--r-- 1 lukas staff 1186578 23 Apr 10:41 compact_monitor_1_1776930087801.mp4\n-rw-r--r-- 1 lukas staff 322993 23 Apr 10:46 compact_monitor_1_1776930392335.mp4\n-rw-r--r-- 1 lukas staff 120434 23 Apr 10:51 compact_monitor_1_1776930696294.mp4\n-rw-r--r-- 1 lukas staff 111489 23 Apr 10:56 compact_monitor_1_1776931004441.mp4\n-rw-r--r-- 1 lukas staff 560588 23 Apr 11:01 compact_monitor_1_1776931314879.mp4\n-rw-r--r-- 1 lukas staff 2146373 23 Apr 11:07 compact_monitor_1_1776931618003.mp4\n-rw-r--r-- 1 lukas staff 1276021 23 Apr 11:12 compact_monitor_1_1776931930806.mp4\n-rw-r--r-- 1 lukas staff 274120 23 Apr 11:17 compact_monitor_1_1776932235717.mp4\n-rw-r--r-- 1 lukas staff 212162 23 Apr 11:22 compact_monitor_1_1776932541353.mp4\n-rw-r--r-- 1 lukas staff 639071 23 Apr 11:27 compact_monitor_1_1776932847264.mp4\n-rw-r--r-- 1 lukas staff 315645 23 Apr 11:32 compact_monitor_1_1776933174068.mp4\n-rw-r--r-- 1 lukas staff 518635 23 Apr 11:38 compact_monitor_1_1776933492233.mp4\n-rw-r--r-- 1 lukas staff 1886880 23 Apr 11:43 compact_monitor_1_1776933806263.mp4\n-rw-r--r-- 1 lukas staff 2316900 23 Apr 11:48 compact_monitor_1_1776934133065.mp4\n-rw-r--r-- 1 lukas staff 1589469 23 Apr 11:54 compact_monitor_1_1776934449640.mp4\n-rw-r--r-- 1 lukas staff 592352 23 Apr 11:59 compact_monitor_1_1776934755385.mp4\n-rw-r--r-- 1 lukas staff 1631938 23 Apr 12:04 compact_monitor_1_1776935058652.mp4\n-rw-r--r-- 1 lukas staff 6099603 23 Apr 12:24 compact_monitor_1_1776936289062.mp4\n-rw-r--r-- 1 lukas staff 91125 23 Apr 12:35 compact_monitor_1_1776936919782.mp4\n-rw-r--r-- 1 lukas staff 2955581 23 Apr 12:40 compact_monitor_1_1776937224602.mp4\n-rw-r--r-- 1 lukas staff 3002373 23 Apr 12:45 compact_monitor_1_1776937538337.mp4\n-rw-r--r-- 1 lukas staff 3116117 23 Apr 12:50 compact_monitor_1_1776937842939.mp4\n-rw-r--r-- 1 lukas staff 2426878 23 Apr 12:55 compact_monitor_1_1776938150380.mp4\n-rw-r--r-- 1 lukas staff 2028056 23 Apr 13:01 compact_monitor_1_1776938459676.mp4\n-rw-r--r-- 1 lukas staff 2104678 23 Apr 13:06 compact_monitor_1_1776938769006.mp4\n-rw-r--r-- 1 lukas staff 3004512 23 Apr 13:11 compact_monitor_1_1776939078771.mp4\n-rw-r--r-- 1 lukas staff 1643140 23 Apr 13:16 compact_monitor_1_1776939389326.mp4\n-rw-r--r-- 1 lukas staff 1923058 23 Apr 13:21 compact_monitor_1_1776939706398.mp4\n-rw-r--r-- 1 lukas staff 900757 23 Apr 13:26 compact_monitor_1_1776940011813.mp4\n-rw-r--r-- 1 lukas staff 2964075 23 Apr 13:32 compact_monitor_1_1776940319106.mp4\n-rw-r--r-- 1 lukas staff 2419466 23 Apr 13:37 compact_monitor_1_1776940628353.mp4\n-rw-r--r-- 1 lukas staff 2447997 23 Apr 13:42 compact_monitor_1_1776940941730.mp4\n-rw-r--r-- 1 lukas staff 2202220 23 Apr 13:47 compact_monitor_1_1776941248366.mp4\n-rw-r--r-- 1 lukas staff 2309716 23 Apr 13:52 compact_monitor_1_1776941558220.mp4\n-rw-r--r-- 1 lukas staff 2049791 23 Apr 13:57 compact_monitor_1_1776941868192.mp4\n-rw-r--r-- 1 lukas staff 6097615 24 Apr 09:20 compact_monitor_1_1777011631828.mp4\n-rw-r--r-- 1 lukas staff 215938 23 Apr 09:24 compact_monitor_2_1776925467316.mp4\n-rw-r--r-- 1 lukas staff 3956084 23 Apr 09:29 compact_monitor_2_1776925774333.mp4\n-rw-r--r-- 1 lukas staff 3998164 23 Apr 09:34 compact_monitor_2_1776926081685.mp4\n-rw-r--r-- 1 lukas staff 2446471 23 Apr 09:39 compact_monitor_2_1776926391115.mp4\n-rw-r--r-- 1 lukas staff 776043 23 Apr 09:44 compact_monitor_2_1776926697217.mp4\n-rw-r--r-- 1 lukas staff 802594 23 Apr 09:50 compact_monitor_2_1776927003100.mp4\n-rw-r--r-- 1 lukas staff 1453164 23 Apr 09:55 compact_monitor_2_1776927313533.mp4\n-rw-r--r-- 1 lukas staff 1449750 23 Apr 10:00 compact_monitor_2_1776927621638.mp4\n-rw-r--r-- 1 lukas staff 1635019 23 Apr 10:05 compact_monitor_2_1776927933130.mp4\n-rw-r--r-- 1 lukas staff 595843 23 Apr 10:10 compact_monitor_2_1776928245303.mp4\n-rw-r--r-- 1 lukas staff 531088 23 Apr 10:15 compact_monitor_2_1776928550520.mp4\n-rw-r--r-- 1 lukas staff 846515 23 Apr 10:20 compact_monitor_2_1776928856922.mp4\n-rw-r--r-- 1 lukas staff 904088 23 Apr 10:26 compact_monitor_2_1776929169922.mp4\n-rw-r--r-- 1 lukas staff 786829 23 Apr 10:31 compact_monitor_2_1776929479675.mp4\n-rw-r--r-- 1 lukas staff 729181 23 Apr 10:36 compact_monitor_2_1776929783409.mp4\n-rw-r--r-- 1 lukas staff 1116843 23 Apr 10:41 compact_monitor_2_1776930090240.mp4\n-rw-r--r-- 1 lukas staff 889822 23 Apr 10:46 compact_monitor_2_1776930393454.mp4\n-rw-r--r-- 1 lukas staff 444250 23 Apr 10:51 compact_monitor_2_1776930697139.mp4\n-rw-r--r-- 1 lukas staff 1024242 23 Apr 10:56 compact_monitor_2_1776931006436.mp4\n-rw-r--r-- 1 lukas staff 1206096 23 Apr 11:01 compact_monitor_2_1776931316182.mp4\n-rw-r--r-- 1 lukas staff 1249893 23 Apr 11:07 compact_monitor_2_1776931621999.mp4\n-rw-r--r-- 1 lukas staff 401526 23 Apr 11:12 compact_monitor_2_1776931932870.mp4\n-rw-r--r-- 1 lukas staff 982256 23 Apr 11:17 compact_monitor_2_1776932236802.mp4\n-rw-r--r-- 1 lukas staff 1131582 23 Apr 11:22 compact_monitor_2_1776932542205.mp4\n-rw-r--r-- 1 lukas staff 808822 23 Apr 11:27 compact_monitor_2_1776932849317.mp4\n-rw-r--r-- 1 lukas staff 442538 23 Apr 11:32 compact_monitor_2_1776933176662.mp4\n-rw-r--r-- 1 lukas staff 675274 23 Apr 11:38 compact_monitor_2_1776933495384.mp4\n-rw-r--r-- 1 lukas staff 1534516 23 Apr 11:43 compact_monitor_2_1776933812317.mp4\n-rw-r--r-- 1 lukas staff 1657590 23 Apr 11:49 compact_monitor_2_1776934138529.mp4\n-rw-r--r-- 1 lukas staff 1222887 23 Apr 11:54 compact_monitor_2_1776934453154.mp4\n-rw-r--r-- 1 lukas staff 1003999 23 Apr 11:59 compact_monitor_2_1776934756922.mp4\n-rw-r--r-- 1 lukas staff 1168918 23 Apr 12:04 compact_monitor_2_1776935062292.mp4\n-rw-r--r-- 1 lukas staff 5755378 23 Apr 12:25 compact_monitor_2_1776936297908.mp4\n-rw-r--r-- 1 lukas staff 302577 23 Apr 12:25 compact_monitor_2_1776936305094.mp4\n-rw-r--r-- 1 lukas staff 1710485 23 Apr 12:35 compact_monitor_2_1776936920837.mp4\n-rw-r--r-- 1 lukas staff 2705135 23 Apr 12:40 compact_monitor_2_1776937228721.mp4\n-rw-r--r-- 1 lukas staff 1751314 23 Apr 12:45 compact_monitor_2_1776937539934.mp4\n-rw-r--r-- 1 lukas staff 924709 23 Apr 12:50 compact_monitor_2_1776937844858.mp4\n-rw-r--r-- 1 lukas staff 1285623 23 Apr 12:55 compact_monitor_2_1776938151831.mp4\n-rw-r--r-- 1 lukas staff 405857 23 Apr 13:01 compact_monitor_2_1776938461195.mp4\n-rw-r--r-- 1 lukas staff 407926 23 Apr 13:06 compact_monitor_2_1776938770290.mp4\n-rw-r--r-- 1 lukas staff 958635 23 Apr 13:11 compact_monitor_2_1776939080379.mp4\n-rw-r--r-- 1 lukas staff 3622447 23 Apr 13:16 compact_monitor_2_1776939392822.mp4\n-rw-r--r-- 1 lukas staff 1850262 23 Apr 13:21 compact_monitor_2_1776939708714.mp4\n-rw-r--r-- 1 lukas staff 4725657 23 Apr 13:26 compact_monitor_2_1776940013773.mp4\n-rw-r--r-- 1 lukas staff 3590913 23 Apr 13:32 compact_monitor_2_1776940321454.mp4\n-rw-r--r-- 1 lukas staff 4073703 23 Apr 13:37 compact_monitor_2_1776940630759.mp4\n-rw-r--r-- 1 lukas staff 6432165 23 Apr 13:42 compact_monitor_2_1776940943551.mp4\n-rw-r--r-- 1 lukas staff 1484957 23 Apr 13:47 compact_monitor_2_1776941250256.mp4\n-rw-r--r-- 1 lukas staff 1336470 23 Apr 13:52 compact_monitor_2_1776941561295.mp4\n-rw-r--r-- 1 lukas staff 1327781 23 Apr 13:57 compact_monitor_2_1776941869906.mp4\n-rw-r--r-- 1 lukas staff 4219671 24 Apr 09:20 compact_monitor_2_1777011640295.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-23 $ ~/.screenpipe/screenpipe_sync.sh 2026-04-23\n[2026-04-24 09:31:53] ========================================\n[2026-04-24 09:31:53] Screenpipe sync starting for: 2026-04-23\n[2026-04-24 09:31:53] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK (6.8G)\n[2026-04-24 09:31:53] ERROR: NAS not mounted at /Volumes/Test/screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-23 $ ~/.screenpipe/screenpipe_sync.sh 2026-04-23\n[2026-04-24 09:32:09] ========================================\n[2026-04-24 09:32:09] Screenpipe sync starting for: 2026-04-23\n[2026-04-24 09:32:09] ========================================\n\n[+00m00s] ▶ Preflight checks\n Source DB: OK (6.8G)\n NAS mount: OK /Volumes/Test/screenpipe\n Archive DB: exists (5.8G)\n Data dir: OK (104 files, 165M)\n\n[+00m01s] ▶ Counting source rows for 2026-04-23\n frames: 2564\n elements: 208937\n ui_events: 3546\n ocr_text: 904\n meetings: 2\n\n[+00m01s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m01s\n creating indexes ⠋","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.19722222,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.19722222,"top":0.05888889,"width":0.19722222,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.2013889,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.39444444,"top":0.05888889,"width":0.19722222,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.3986111,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.59166664,"top":0.05888889,"width":0.19722222,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.59583336,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"sleep","depth":2,"bounds":{"left":0.7888889,"top":0.05888889,"width":0.19722222,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.79305553,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.95763886,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"sleep","depth":1,"bounds":{"left":0.4875,"top":0.033333335,"width":0.027083334,"height":0.017777778},"role_description":"text"}]...
|
-3354463313612987468
|
-6889225252150231407
|
visual_change
|
accessibility
|
NULL
|
Last login: Thu Apr 23 14:01:29 on ttys009
Poetry Last login: Thu Apr 23 14:01:29 on ttys009
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe/data/data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-04-23
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-23 $ ll
total 338296
drwxr-xr-x 106 lukas staff 3392 24 Apr 09:20 .
drwxr-xr-x 17 lukas staff 544 24 Apr 09:19 ..
-rw-r--r-- 1 lukas staff 174550 23 Apr 11:38 1776933481776_m1.jpg
-rw-r--r-- 1 lukas staff 1448572 23 Apr 09:24 compact_monitor_1_1776925466477.mp4
-rw-r--r-- 1 lukas staff 2157204 23 Apr 09:29 compact_monitor_1_1776925771961.mp4
-rw-r--r-- 1 lukas staff 785851 23 Apr 09:34 compact_monitor_1_1776926078542.mp4
-rw-r--r-- 1 lukas staff 319924 23 Apr 09:39 compact_monitor_1_1776926389122.mp4
-rw-r--r-- 1 lukas staff 178437 23 Apr 09:44 compact_monitor_1_1776926696343.mp4
-rw-r--r-- 1 lukas staff 182316 23 Apr 09:50 compact_monitor_1_1776927001989.mp4
-rw-r--r-- 1 lukas staff 475405 23 Apr 09:55 compact_monitor_1_1776927311821.mp4
-rw-r--r-- 1 lukas staff 3670216 23 Apr 10:00 compact_monitor_1_1776927616817.mp4
-rw-r--r-- 1 lukas staff 1311845 23 Apr 10:05 compact_monitor_1_1776927930717.mp4
-rw-r--r-- 1 lukas staff 1768745 23 Apr 10:10 compact_monitor_1_1776928242002.mp4
-rw-r--r-- 1 lukas staff 942473 23 Apr 10:15 compact_monitor_1_1776928549085.mp4
-rw-r--r-- 1 lukas staff 911130 23 Apr 10:20 compact_monitor_1_1776928854473.mp4
-rw-r--r-- 1 lukas staff 1249531 23 Apr 10:26 compact_monitor_1_1776929165912.mp4
-rw-r--r-- 1 lukas staff 2106654 23 Apr 10:31 compact_monitor_1_1776929476115.mp4
-rw-r--r-- 1 lukas staff 1633583 23 Apr 10:36 compact_monitor_1_1776929781778.mp4
-rw-r--r-- 1 lukas staff 1186578 23 Apr 10:41 compact_monitor_1_1776930087801.mp4
-rw-r--r-- 1 lukas staff 322993 23 Apr 10:46 compact_monitor_1_1776930392335.mp4
-rw-r--r-- 1 lukas staff 120434 23 Apr 10:51 compact_monitor_1_1776930696294.mp4
-rw-r--r-- 1 lukas staff 111489 23 Apr 10:56 compact_monitor_1_1776931004441.mp4
-rw-r--r-- 1 lukas staff 560588 23 Apr 11:01 compact_monitor_1_1776931314879.mp4
-rw-r--r-- 1 lukas staff 2146373 23 Apr 11:07 compact_monitor_1_1776931618003.mp4
-rw-r--r-- 1 lukas staff 1276021 23 Apr 11:12 compact_monitor_1_1776931930806.mp4
-rw-r--r-- 1 lukas staff 274120 23 Apr 11:17 compact_monitor_1_1776932235717.mp4
-rw-r--r-- 1 lukas staff 212162 23 Apr 11:22 compact_monitor_1_1776932541353.mp4
-rw-r--r-- 1 lukas staff 639071 23 Apr 11:27 compact_monitor_1_1776932847264.mp4
-rw-r--r-- 1 lukas staff 315645 23 Apr 11:32 compact_monitor_1_1776933174068.mp4
-rw-r--r-- 1 lukas staff 518635 23 Apr 11:38 compact_monitor_1_1776933492233.mp4
-rw-r--r-- 1 lukas staff 1886880 23 Apr 11:43 compact_monitor_1_1776933806263.mp4
-rw-r--r-- 1 lukas staff 2316900 23 Apr 11:48 compact_monitor_1_1776934133065.mp4
-rw-r--r-- 1 lukas staff 1589469 23 Apr 11:54 compact_monitor_1_1776934449640.mp4
-rw-r--r-- 1 lukas staff 592352 23 Apr 11:59 compact_monitor_1_1776934755385.mp4
-rw-r--r-- 1 lukas staff 1631938 23 Apr 12:04 compact_monitor_1_1776935058652.mp4
-rw-r--r-- 1 lukas staff 6099603 23 Apr 12:24 compact_monitor_1_1776936289062.mp4
-rw-r--r-- 1 lukas staff 91125 23 Apr 12:35 compact_monitor_1_1776936919782.mp4
-rw-r--r-- 1 lukas staff 2955581 23 Apr 12:40 compact_monitor_1_1776937224602.mp4
-rw-r--r-- 1 lukas staff 3002373 23 Apr 12:45 compact_monitor_1_1776937538337.mp4
-rw-r--r-- 1 lukas staff 3116117 23 Apr 12:50 compact_monitor_1_1776937842939.mp4
-rw-r--r-- 1 lukas staff 2426878 23 Apr 12:55 compact_monitor_1_1776938150380.mp4
-rw-r--r-- 1 lukas staff 2028056 23 Apr 13:01 compact_monitor_1_1776938459676.mp4
-rw-r--r-- 1 lukas staff 2104678 23 Apr 13:06 compact_monitor_1_1776938769006.mp4
-rw-r--r-- 1 lukas staff 3004512 23 Apr 13:11 compact_monitor_1_1776939078771.mp4
-rw-r--r-- 1 lukas staff 1643140 23 Apr 13:16 compact_monitor_1_1776939389326.mp4
-rw-r--r-- 1 lukas staff 1923058 23 Apr 13:21 compact_monitor_1_1776939706398.mp4
-rw-r--r-- 1 lukas staff 900757 23 Apr 13:26 compact_monitor_1_1776940011813.mp4
-rw-r--r-- 1 lukas staff 2964075 23 Apr 13:32 compact_monitor_1_1776940319106.mp4
-rw-r--r-- 1 lukas staff 2419466 23 Apr 13:37 compact_monitor_1_1776940628353.mp4
-rw-r--r-- 1 lukas staff 2447997 23 Apr 13:42 compact_monitor_1_1776940941730.mp4
-rw-r--r-- 1 lukas staff 2202220 23 Apr 13:47 compact_monitor_1_1776941248366.mp4
-rw-r--r-- 1 lukas staff 2309716 23 Apr 13:52 compact_monitor_1_1776941558220.mp4
-rw-r--r-- 1 lukas staff 2049791 23 Apr 13:57 compact_monitor_1_1776941868192.mp4
-rw-r--r-- 1 lukas staff 6097615 24 Apr 09:20 compact_monitor_1_1777011631828.mp4
-rw-r--r-- 1 lukas staff 215938 23 Apr 09:24 compact_monitor_2_1776925467316.mp4
-rw-r--r-- 1 lukas staff 3956084 23 Apr 09:29 compact_monitor_2_1776925774333.mp4
-rw-r--r-- 1 lukas staff 3998164 23 Apr 09:34 compact_monitor_2_1776926081685.mp4
-rw-r--r-- 1 lukas staff 2446471 23 Apr 09:39 compact_monitor_2_1776926391115.mp4
-rw-r--r-- 1 lukas staff 776043 23 Apr 09:44 compact_monitor_2_1776926697217.mp4
-rw-r--r-- 1 lukas staff 802594 23 Apr 09:50 compact_monitor_2_1776927003100.mp4
-rw-r--r-- 1 lukas staff 1453164 23 Apr 09:55 compact_monitor_2_1776927313533.mp4
-rw-r--r-- 1 lukas staff 1449750 23 Apr 10:00 compact_monitor_2_1776927621638.mp4
-rw-r--r-- 1 lukas staff 1635019 23 Apr 10:05 compact_monitor_2_1776927933130.mp4
-rw-r--r-- 1 lukas staff 595843 23 Apr 10:10 compact_monitor_2_1776928245303.mp4
-rw-r--r-- 1 lukas staff 531088 23 Apr 10:15 compact_monitor_2_1776928550520.mp4
-rw-r--r-- 1 lukas staff 846515 23 Apr 10:20 compact_monitor_2_1776928856922.mp4
-rw-r--r-- 1 lukas staff 904088 23 Apr 10:26 compact_monitor_2_1776929169922.mp4
-rw-r--r-- 1 lukas staff 786829 23 Apr 10:31 compact_monitor_2_1776929479675.mp4
-rw-r--r-- 1 lukas staff 729181 23 Apr 10:36 compact_monitor_2_1776929783409.mp4
-rw-r--r-- 1 lukas staff 1116843 23 Apr 10:41 compact_monitor_2_1776930090240.mp4
-rw-r--r-- 1 lukas staff 889822 23 Apr 10:46 compact_monitor_2_1776930393454.mp4
-rw-r--r-- 1 lukas staff 444250 23 Apr 10:51 compact_monitor_2_1776930697139.mp4
-rw-r--r-- 1 lukas staff 1024242 23 Apr 10:56 compact_monitor_2_1776931006436.mp4
-rw-r--r-- 1 lukas staff 1206096 23 Apr 11:01 compact_monitor_2_1776931316182.mp4
-rw-r--r-- 1 lukas staff 1249893 23 Apr 11:07 compact_monitor_2_1776931621999.mp4
-rw-r--r-- 1 lukas staff 401526 23 Apr 11:12 compact_monitor_2_1776931932870.mp4
-rw-r--r-- 1 lukas staff 982256 23 Apr 11:17 compact_monitor_2_1776932236802.mp4
-rw-r--r-- 1 lukas staff 1131582 23 Apr 11:22 compact_monitor_2_1776932542205.mp4
-rw-r--r-- 1 lukas staff 808822 23 Apr 11:27 compact_monitor_2_1776932849317.mp4
-rw-r--r-- 1 lukas staff 442538 23 Apr 11:32 compact_monitor_2_1776933176662.mp4
-rw-r--r-- 1 lukas staff 675274 23 Apr 11:38 compact_monitor_2_1776933495384.mp4
-rw-r--r-- 1 lukas staff 1534516 23 Apr 11:43 compact_monitor_2_1776933812317.mp4
-rw-r--r-- 1 lukas staff 1657590 23 Apr 11:49 compact_monitor_2_1776934138529.mp4
-rw-r--r-- 1 lukas staff 1222887 23 Apr 11:54 compact_monitor_2_1776934453154.mp4
-rw-r--r-- 1 lukas staff 1003999 23 Apr 11:59 compact_monitor_2_1776934756922.mp4
-rw-r--r-- 1 lukas staff 1168918 23 Apr 12:04 compact_monitor_2_1776935062292.mp4
-rw-r--r-- 1 lukas staff 5755378 23 Apr 12:25 compact_monitor_2_1776936297908.mp4
-rw-r--r-- 1 lukas staff 302577 23 Apr 12:25 compact_monitor_2_1776936305094.mp4
-rw-r--r-- 1 lukas staff 1710485 23 Apr 12:35 compact_monitor_2_1776936920837.mp4
-rw-r--r-- 1 lukas staff 2705135 23 Apr 12:40 compact_monitor_2_1776937228721.mp4
-rw-r--r-- 1 lukas staff 1751314 23 Apr 12:45 compact_monitor_2_1776937539934.mp4
-rw-r--r-- 1 lukas staff 924709 23 Apr 12:50 compact_monitor_2_1776937844858.mp4
-rw-r--r-- 1 lukas staff 1285623 23 Apr 12:55 compact_monitor_2_1776938151831.mp4
-rw-r--r-- 1 lukas staff 405857 23 Apr 13:01 compact_monitor_2_1776938461195.mp4
-rw-r--r-- 1 lukas staff 407926 23 Apr 13:06 compact_monitor_2_1776938770290.mp4
-rw-r--r-- 1 lukas staff 958635 23 Apr 13:11 compact_monitor_2_1776939080379.mp4
-rw-r--r-- 1 lukas staff 3622447 23 Apr 13:16 compact_monitor_2_1776939392822.mp4
-rw-r--r-- 1 lukas staff 1850262 23 Apr 13:21 compact_monitor_2_1776939708714.mp4
-rw-r--r-- 1 lukas staff 4725657 23 Apr 13:26 compact_monitor_2_1776940013773.mp4
-rw-r--r-- 1 lukas staff 3590913 23 Apr 13:32 compact_monitor_2_1776940321454.mp4
-rw-r--r-- 1 lukas staff 4073703 23 Apr 13:37 compact_monitor_2_1776940630759.mp4
-rw-r--r-- 1 lukas staff 6432165 23 Apr 13:42 compact_monitor_2_1776940943551.mp4
-rw-r--r-- 1 lukas staff 1484957 23 Apr 13:47 compact_monitor_2_1776941250256.mp4
-rw-r--r-- 1 lukas staff 1336470 23 Apr 13:52 compact_monitor_2_1776941561295.mp4
-rw-r--r-- 1 lukas staff 1327781 23 Apr 13:57 compact_monitor_2_1776941869906.mp4
-rw-r--r-- 1 lukas staff 4219671 24 Apr 09:20 compact_monitor_2_1777011640295.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-23 $ cd 2026-04-23
cd: no such file or directory: 2026-04-23
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-23 $ ll
total 338296
drwxr-xr-x 106 lukas staff 3392 24 Apr 09:20 .
drwxr-xr-x 17 lukas staff 544 24 Apr 09:19 ..
-rw-r--r-- 1 lukas staff 174550 23 Apr 11:38 1776933481776_m1.jpg
-rw-r--r-- 1 lukas staff 1448572 23 Apr 09:24 compact_monitor_1_1776925466477.mp4
-rw-r--r-- 1 lukas staff 2157204 23 Apr 09:29 compact_monitor_1_1776925771961.mp4
-rw-r--r-- 1 lukas staff 785851 23 Apr 09:34 compact_monitor_1_1776926078542.mp4
-rw-r--r-- 1 lukas staff 319924 23 Apr 09:39 compact_monitor_1_1776926389122.mp4
-rw-r--r-- 1 lukas staff 178437 23 Apr 09:44 compact_monitor_1_1776926696343.mp4
-rw-r--r-- 1 lukas staff 182316 23 Apr 09:50 compact_monitor_1_1776927001989.mp4
-rw-r--r-- 1 lukas staff 475405 23 Apr 09:55 compact_monitor_1_1776927311821.mp4
-rw-r--r-- 1 lukas staff 3670216 23 Apr 10:00 compact_monitor_1_1776927616817.mp4
-rw-r--r-- 1 lukas staff 1311845 23 Apr 10:05 compact_monitor_1_1776927930717.mp4
-rw-r--r-- 1 lukas staff 1768745 23 Apr 10:10 compact_monitor_1_1776928242002.mp4
-rw-r--r-- 1 lukas staff 942473 23 Apr 10:15 compact_monitor_1_1776928549085.mp4
-rw-r--r-- 1 lukas staff 911130 23 Apr 10:20 compact_monitor_1_1776928854473.mp4
-rw-r--r-- 1 lukas staff 1249531 23 Apr 10:26 compact_monitor_1_1776929165912.mp4
-rw-r--r-- 1 lukas staff 2106654 23 Apr 10:31 compact_monitor_1_1776929476115.mp4
-rw-r--r-- 1 lukas staff 1633583 23 Apr 10:36 compact_monitor_1_1776929781778.mp4
-rw-r--r-- 1 lukas staff 1186578 23 Apr 10:41 compact_monitor_1_1776930087801.mp4
-rw-r--r-- 1 lukas staff 322993 23 Apr 10:46 compact_monitor_1_1776930392335.mp4
-rw-r--r-- 1 lukas staff 120434 23 Apr 10:51 compact_monitor_1_1776930696294.mp4
-rw-r--r-- 1 lukas staff 111489 23 Apr 10:56 compact_monitor_1_1776931004441.mp4
-rw-r--r-- 1 lukas staff 560588 23 Apr 11:01 compact_monitor_1_1776931314879.mp4
-rw-r--r-- 1 lukas staff 2146373 23 Apr 11:07 compact_monitor_1_1776931618003.mp4
-rw-r--r-- 1 lukas staff 1276021 23 Apr 11:12 compact_monitor_1_1776931930806.mp4
-rw-r--r-- 1 lukas staff 274120 23 Apr 11:17 compact_monitor_1_1776932235717.mp4
-rw-r--r-- 1 lukas staff 212162 23 Apr 11:22 compact_monitor_1_1776932541353.mp4
-rw-r--r-- 1 lukas staff 639071 23 Apr 11:27 compact_monitor_1_1776932847264.mp4
-rw-r--r-- 1 lukas staff 315645 23 Apr 11:32 compact_monitor_1_1776933174068.mp4
-rw-r--r-- 1 lukas staff 518635 23 Apr 11:38 compact_monitor_1_1776933492233.mp4
-rw-r--r-- 1 lukas staff 1886880 23 Apr 11:43 compact_monitor_1_1776933806263.mp4
-rw-r--r-- 1 lukas staff 2316900 23 Apr 11:48 compact_monitor_1_1776934133065.mp4
-rw-r--r-- 1 lukas staff 1589469 23 Apr 11:54 compact_monitor_1_1776934449640.mp4
-rw-r--r-- 1 lukas staff 592352 23 Apr 11:59 compact_monitor_1_1776934755385.mp4
-rw-r--r-- 1 lukas staff 1631938 23 Apr 12:04 compact_monitor_1_1776935058652.mp4
-rw-r--r-- 1 lukas staff 6099603 23 Apr 12:24 compact_monitor_1_1776936289062.mp4
-rw-r--r-- 1 lukas staff 91125 23 Apr 12:35 compact_monitor_1_1776936919782.mp4
-rw-r--r-- 1 lukas staff 2955581 23 Apr 12:40 compact_monitor_1_1776937224602.mp4
-rw-r--r-- 1 lukas staff 3002373 23 Apr 12:45 compact_monitor_1_1776937538337.mp4
-rw-r--r-- 1 lukas staff 3116117 23 Apr 12:50 compact_monitor_1_1776937842939.mp4
-rw-r--r-- 1 lukas staff 2426878 23 Apr 12:55 compact_monitor_1_1776938150380.mp4
-rw-r--r-- 1 lukas staff 2028056 23 Apr 13:01 compact_monitor_1_1776938459676.mp4
-rw-r--r-- 1 lukas staff 2104678 23 Apr 13:06 compact_monitor_1_1776938769006.mp4
-rw-r--r-- 1 lukas staff 3004512 23 Apr 13:11 compact_monitor_1_1776939078771.mp4
-rw-r--r-- 1 lukas staff 1643140 23 Apr 13:16 compact_monitor_1_1776939389326.mp4
-rw-r--r-- 1 lukas staff 1923058 23 Apr 13:21 compact_monitor_1_1776939706398.mp4
-rw-r--r-- 1 lukas staff 900757 23 Apr 13:26 compact_monitor_1_1776940011813.mp4
-rw-r--r-- 1 lukas staff 2964075 23 Apr 13:32 compact_monitor_1_1776940319106.mp4
-rw-r--r-- 1 lukas staff 2419466 23 Apr 13:37 compact_monitor_1_1776940628353.mp4
-rw-r--r-- 1 lukas staff 2447997 23 Apr 13:42 compact_monitor_1_1776940941730.mp4
-rw-r--r-- 1 lukas staff 2202220 23 Apr 13:47 compact_monitor_1_1776941248366.mp4
-rw-r--r-- 1 lukas staff 2309716 23 Apr 13:52 compact_monitor_1_1776941558220.mp4
-rw-r--r-- 1 lukas staff 2049791 23 Apr 13:57 compact_monitor_1_1776941868192.mp4
-rw-r--r-- 1 lukas staff 6097615 24 Apr 09:20 compact_monitor_1_1777011631828.mp4
-rw-r--r-- 1 lukas staff 215938 23 Apr 09:24 compact_monitor_2_1776925467316.mp4
-rw-r--r-- 1 lukas staff 3956084 23 Apr 09:29 compact_monitor_2_1776925774333.mp4
-rw-r--r-- 1 lukas staff 3998164 23 Apr 09:34 compact_monitor_2_1776926081685.mp4
-rw-r--r-- 1 lukas staff 2446471 23 Apr 09:39 compact_monitor_2_1776926391115.mp4
-rw-r--r-- 1 lukas staff 776043 23 Apr 09:44 compact_monitor_2_1776926697217.mp4
-rw-r--r-- 1 lukas staff 802594 23 Apr 09:50 compact_monitor_2_1776927003100.mp4
-rw-r--r-- 1 lukas staff 1453164 23 Apr 09:55 compact_monitor_2_1776927313533.mp4
-rw-r--r-- 1 lukas staff 1449750 23 Apr 10:00 compact_monitor_2_1776927621638.mp4
-rw-r--r-- 1 lukas staff 1635019 23 Apr 10:05 compact_monitor_2_1776927933130.mp4
-rw-r--r-- 1 lukas staff 595843 23 Apr 10:10 compact_monitor_2_1776928245303.mp4
-rw-r--r-- 1 lukas staff 531088 23 Apr 10:15 compact_monitor_2_1776928550520.mp4
-rw-r--r-- 1 lukas staff 846515 23 Apr 10:20 compact_monitor_2_1776928856922.mp4
-rw-r--r-- 1 lukas staff 904088 23 Apr 10:26 compact_monitor_2_1776929169922.mp4
-rw-r--r-- 1 lukas staff 786829 23 Apr 10:31 compact_monitor_2_1776929479675.mp4
-rw-r--r-- 1 lukas staff 729181 23 Apr 10:36 compact_monitor_2_1776929783409.mp4
-rw-r--r-- 1 lukas staff 1116843 23 Apr 10:41 compact_monitor_2_1776930090240.mp4
-rw-r--r-- 1 lukas staff 889822 23 Apr 10:46 compact_monitor_2_1776930393454.mp4
-rw-r--r-- 1 lukas staff 444250 23 Apr 10:51 compact_monitor_2_1776930697139.mp4
-rw-r--r-- 1 lukas staff 1024242 23 Apr 10:56 compact_monitor_2_1776931006436.mp4
-rw-r--r-- 1 lukas staff 1206096 23 Apr 11:01 compact_monitor_2_1776931316182.mp4
-rw-r--r-- 1 lukas staff 1249893 23 Apr 11:07 compact_monitor_2_1776931621999.mp4
-rw-r--r-- 1 lukas staff 401526 23 Apr 11:12 compact_monitor_2_1776931932870.mp4
-rw-r--r-- 1 lukas staff 982256 23 Apr 11:17 compact_monitor_2_1776932236802.mp4
-rw-r--r-- 1 lukas staff 1131582 23 Apr 11:22 compact_monitor_2_1776932542205.mp4
-rw-r--r-- 1 lukas staff 808822 23 Apr 11:27 compact_monitor_2_1776932849317.mp4
-rw-r--r-- 1 lukas staff 442538 23 Apr 11:32 compact_monitor_2_1776933176662.mp4
-rw-r--r-- 1 lukas staff 675274 23 Apr 11:38 compact_monitor_2_1776933495384.mp4
-rw-r--r-- 1 lukas staff 1534516 23 Apr 11:43 compact_monitor_2_1776933812317.mp4
-rw-r--r-- 1 lukas staff 1657590 23 Apr 11:49 compact_monitor_2_1776934138529.mp4
-rw-r--r-- 1 lukas staff 1222887 23 Apr 11:54 compact_monitor_2_1776934453154.mp4
-rw-r--r-- 1 lukas staff 1003999 23 Apr 11:59 compact_monitor_2_1776934756922.mp4
-rw-r--r-- 1 lukas staff 1168918 23 Apr 12:04 compact_monitor_2_1776935062292.mp4
-rw-r--r-- 1 lukas staff 5755378 23 Apr 12:25 compact_monitor_2_1776936297908.mp4
-rw-r--r-- 1 lukas staff 302577 23 Apr 12:25 compact_monitor_2_1776936305094.mp4
-rw-r--r-- 1 lukas staff 1710485 23 Apr 12:35 compact_monitor_2_1776936920837.mp4
-rw-r--r-- 1 lukas staff 2705135 23 Apr 12:40 compact_monitor_2_1776937228721.mp4
-rw-r--r-- 1 lukas staff 1751314 23 Apr 12:45 compact_monitor_2_1776937539934.mp4
-rw-r--r-- 1 lukas staff 924709 23 Apr 12:50 compact_monitor_2_1776937844858.mp4
-rw-r--r-- 1 lukas staff 1285623 23 Apr 12:55 compact_monitor_2_1776938151831.mp4
-rw-r--r-- 1 lukas staff 405857 23 Apr 13:01 compact_monitor_2_1776938461195.mp4
-rw-r--r-- 1 lukas staff 407926 23 Apr 13:06 compact_monitor_2_1776938770290.mp4
-rw-r--r-- 1 lukas staff 958635 23 Apr 13:11 compact_monitor_2_1776939080379.mp4
-rw-r--r-- 1 lukas staff 3622447 23 Apr 13:16 compact_monitor_2_1776939392822.mp4
-rw-r--r-- 1 lukas staff 1850262 23 Apr 13:21 compact_monitor_2_1776939708714.mp4
-rw-r--r-- 1 lukas staff 4725657 23 Apr 13:26 compact_monitor_2_1776940013773.mp4
-rw-r--r-- 1 lukas staff 3590913 23 Apr 13:32 compact_monitor_2_1776940321454.mp4
-rw-r--r-- 1 lukas staff 4073703 23 Apr 13:37 compact_monitor_2_1776940630759.mp4
-rw-r--r-- 1 lukas staff 6432165 23 Apr 13:42 compact_monitor_2_1776940943551.mp4
-rw-r--r-- 1 lukas staff 1484957 23 Apr 13:47 compact_monitor_2_1776941250256.mp4
-rw-r--r-- 1 lukas staff 1336470 23 Apr 13:52 compact_monitor_2_1776941561295.mp4
-rw-r--r-- 1 lukas staff 1327781 23 Apr 13:57 compact_monitor_2_1776941869906.mp4
-rw-r--r-- 1 lukas staff 4219671 24 Apr 09:20 compact_monitor_2_1777011640295.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-23 $ ~/.screenpipe/screenpipe_sync.sh 2026-04-23
[2026-04-24 09:31:53] ========================================
[2026-04-24 09:31:53] Screenpipe sync starting for: 2026-04-23
[2026-04-24 09:31:53] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK (6.8G)
[2026-04-24 09:31:53] ERROR: NAS not mounted at /Volumes/Test/screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-04-23 $ ~/.screenpipe/screenpipe_sync.sh 2026-04-23
[2026-04-24 09:32:09] ========================================
[2026-04-24 09:32:09] Screenpipe sync starting for: 2026-04-23
[2026-04-24 09:32:09] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK (6.8G)
NAS mount: OK /Volumes/Test/screenpipe
Archive DB: exists (5.8G)
Data dir: OK (104 files, 165M)
[+00m01s] ▶ Counting source rows for 2026-04-23
frames: 2564
elements: 208937
ui_events: 3546
ocr_text: 904
meetings: 2
[+00m01s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m01s
creating indexes ⠋
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
screenpipe"
Close Tab
sleep
Close Tab
⌥⌘1
sleep...
|
75509
|
NULL
|
|
72374
|
1765
|
4
|
2026-04-22T15:39:58.374275+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-22/1776 /Users/lukas/.screenpipe/data/data/2026-04-22/1776872398374_m2.jpg...
|
Firefox
|
sourcegate/mcp-fathom-server — Work
|
1
|
github.com/sourcegate/mcp-fathom-server
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {"status":"error","message":"You have reached your secondly limit.","errorType":"RATE_LIMIT
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {"status":"error","message":"You have reached your secondly limit.","errorType":"RATE_LIMIT
[JY-20372] AI Reports > Empty page design and promotion - Jira
[JY-20372] AI Reports > Empty page design and promotion - Jira
Jiminny MCP Connector - Product - Confluence
Jiminny MCP Connector - Product - Confluence
Jiminny
Jiminny
Workers | Datadog
Workers | Datadog
Pull requests · jiminny/app
Pull requests · jiminny/app
[JY-20728] [HubSpot] Find the root cause of 429 hit and tweak API client rate limiter - Jira
[JY-20728] [HubSpot] Find the root cause of 429 hit and tweak API client rate limiter - Jira
JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app
JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app
Jiminny
Jiminny
CloudWatch | us-east-2
CloudWatch | us-east-2
Your 'Not enpough activities' report wasn't generated - [EMAIL] - Jiminny Mail
Your 'Not enpough activities' report wasn't generated - [EMAIL] - Jiminny Mail
Jiminny MCP Connector - Product - Confluence
Jiminny MCP Connector - Product - Confluence
sourcegate/mcp-fathom-server
sourcegate/mcp-fathom-server
Close tab
JY-9712 | change nudges schema by nikolaybiaivanov · Pull Request #11983 · jiminny/app
JY-9712 | change nudges schema by nikolaybiaivanov · Pull Request #11983 · jiminny/app
JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app
JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app
Architecture overview - Model Context Protocol
Architecture overview - Model Context Protocol
Laravel MCP - AI tooling for Laravel, by the Laravel team | Laravel - The clean stack for Artisans and agents
Laravel MCP - AI tooling for Laravel, by the Laravel team | Laravel - The clean stack for Artisans and agents
Laravel MCP | Laravel 13.x - The clean stack for Artisans and agents
Laravel MCP | Laravel 13.x - The clean stack for Artisans and agents
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Skip to content
Skip to content
Open menu
Homepage (g then d)
sourcegate
sourcegate
mcp-fathom-server
mcp-fathom-server
Search or jump to…
Type
/
to search
Chat with Copilot
Open Copilot…
Create new...
Issues
Pull requests
Repositories
You have no unread notifications(g then n)
Open user navigation menu
Repository navigation
Repository navigation
Code
Code
Issues
Issues
Pull requests (2)
Pull requests
(
2
)
Agents
Agents
Actions
Actions
Projects
Projects
Security and quality
Security and quality
Insights
Insights
Important update
Important update
On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.
Review this update
Review this update
and manage your preferences in your
GitHub account settings
GitHub account settings
.
Dismiss banner
mcp-fathom-server
mcp-fathom-server
Public
Read github.githubassets.com...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"bounds":{"left":0.28307846,"top":0.0518755,"width":0.07596409,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"SevenShores\\Hubspot\\Exceptions\\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT","depth":4,"bounds":{"left":0.28125,"top":0.09497207,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SevenShores\\Hubspot\\Exceptions\\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT","depth":5,"bounds":{"left":0.2945479,"top":0.10614525,"width":0.4644282,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20372] AI Reports > Empty page design and promotion - Jira","depth":4,"bounds":{"left":0.28125,"top":0.12769353,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20372] AI Reports > Empty page design and promotion - Jira","depth":5,"bounds":{"left":0.2945479,"top":0.13886672,"width":0.11319814,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny MCP Connector - Product - Confluence","depth":4,"bounds":{"left":0.28125,"top":0.16041501,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny MCP Connector - Product - Confluence","depth":5,"bounds":{"left":0.2945479,"top":0.17158818,"width":0.08294548,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.28125,"top":0.19313647,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"bounds":{"left":0.2945479,"top":0.20430966,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Workers | Datadog","depth":4,"bounds":{"left":0.28125,"top":0.22585794,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Workers | Datadog","depth":5,"bounds":{"left":0.2945479,"top":0.23703113,"width":0.032081116,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pull requests · jiminny/app","depth":4,"bounds":{"left":0.28125,"top":0.2585794,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests · jiminny/app","depth":5,"bounds":{"left":0.2945479,"top":0.2697526,"width":0.04537899,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20728] [HubSpot] Find the root cause of 429 hit and tweak API client rate limiter - Jira","depth":4,"bounds":{"left":0.28125,"top":0.29130086,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20728] [HubSpot] Find the root cause of 429 hit and tweak API client rate limiter - Jira","depth":5,"bounds":{"left":0.2945479,"top":0.30247405,"width":0.15791224,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":4,"bounds":{"left":0.28125,"top":0.32402235,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":5,"bounds":{"left":0.2945479,"top":0.33519554,"width":0.16555852,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.28125,"top":0.3567438,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"bounds":{"left":0.2945479,"top":0.367917,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"CloudWatch | us-east-2","depth":4,"bounds":{"left":0.28125,"top":0.38946527,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"CloudWatch | us-east-2","depth":5,"bounds":{"left":0.2945479,"top":0.40063846,"width":0.041223403,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Your 'Not enpough activities' report wasn't generated - lukas.kovalik@jiminny.com - Jiminny Mail","depth":4,"bounds":{"left":0.28125,"top":0.42218676,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Your 'Not enpough activities' report wasn't generated - lukas.kovalik@jiminny.com - Jiminny Mail","depth":5,"bounds":{"left":0.2945479,"top":0.43335995,"width":0.16821809,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny MCP Connector - Product - Confluence","depth":4,"bounds":{"left":0.28125,"top":0.45490822,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny MCP Connector - Product - Confluence","depth":5,"bounds":{"left":0.2945479,"top":0.4660814,"width":0.08294548,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"sourcegate/mcp-fathom-server","depth":4,"bounds":{"left":0.28125,"top":0.48762968,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"sourcegate/mcp-fathom-server","depth":5,"bounds":{"left":0.2945479,"top":0.49880287,"width":0.0546875,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.34857047,"top":0.49481246,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"JY-9712 | change nudges schema by nikolaybiaivanov · Pull Request #11983 · jiminny/app","depth":4,"bounds":{"left":0.28125,"top":0.5203512,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-9712 | change nudges schema by nikolaybiaivanov · Pull Request #11983 · jiminny/app","depth":5,"bounds":{"left":0.2945479,"top":0.53152436,"width":0.15475398,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":4,"bounds":{"left":0.28125,"top":0.55307263,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":5,"bounds":{"left":0.2945479,"top":0.5642458,"width":0.16555852,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Architecture overview - Model Context Protocol","depth":4,"bounds":{"left":0.28125,"top":0.5857941,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Architecture overview - Model Context Protocol","depth":5,"bounds":{"left":0.2945479,"top":0.5969673,"width":0.08277926,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Laravel MCP - AI tooling for Laravel, by the Laravel team | Laravel - The clean stack for Artisans and agents","depth":4,"bounds":{"left":0.28125,"top":0.61851555,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Laravel MCP - AI tooling for Laravel, by the Laravel team | Laravel - The clean stack for Artisans and agents","depth":5,"bounds":{"left":0.2945479,"top":0.62968874,"width":0.18583776,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Laravel MCP | Laravel 13.x - The clean stack for Artisans and agents","depth":4,"bounds":{"left":0.28125,"top":0.651237,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Laravel MCP | Laravel 13.x - The clean stack for Artisans and agents","depth":5,"bounds":{"left":0.2945479,"top":0.6624102,"width":0.1178524,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.2840758,"top":0.6855547,"width":0.07413564,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.2840758,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.29504654,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.30618352,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.31732047,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.32845744,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Skip to content","depth":6,"bounds":{"left":0.36087102,"top":0.0518755,"width":0.0003324468,"height":0.0007980846},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to content","depth":7,"bounds":{"left":0.36087102,"top":0.05347167,"width":0.0029920214,"height":0.21468475},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open menu","depth":9,"bounds":{"left":0.36619017,"top":0.06464485,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Homepage (g then d)","depth":8,"bounds":{"left":0.38081783,"top":0.06464485,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"sourcegate","depth":11,"bounds":{"left":0.3941157,"top":0.06464485,"width":0.028091755,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":13,"bounds":{"left":0.3961104,"top":0.07063048,"width":0.024102394,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"mcp-fathom-server","depth":11,"bounds":{"left":0.42719415,"top":0.06464485,"width":0.048204787,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"mcp-fathom-server","depth":13,"bounds":{"left":0.42918882,"top":0.07063048,"width":0.044215426,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Search or jump to…","depth":8,"bounds":{"left":0.81698805,"top":0.06464485,"width":0.06565824,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Type","depth":11,"bounds":{"left":0.82928854,"top":0.07063048,"width":0.011801862,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":11,"bounds":{"left":0.8424202,"top":0.07222666,"width":0.002493351,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"to search","depth":11,"bounds":{"left":0.84640956,"top":0.07063048,"width":0.021276595,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Chat with Copilot","depth":9,"bounds":{"left":0.88464093,"top":0.06464485,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Open Copilot…","depth":8,"bounds":{"left":0.8949468,"top":0.06464485,"width":0.008643617,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"Create new...","depth":8,"bounds":{"left":0.9115692,"top":0.06464485,"width":0.01662234,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Issues","depth":8,"bounds":{"left":0.93085104,"top":0.06464485,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Pull requests","depth":8,"bounds":{"left":0.94414896,"top":0.06464485,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Repositories","depth":8,"bounds":{"left":0.9574468,"top":0.06464485,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"You have no unread notifications(g then n)","depth":8,"bounds":{"left":0.97074467,"top":0.06464485,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Open user navigation menu","depth":8,"bounds":{"left":0.9840425,"top":0.06464485,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Repository navigation","depth":8,"bounds":{"left":0.36053857,"top":0.051077414,"width":0.0003324468,"height":0.0007980846},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Repository navigation","depth":9,"bounds":{"left":0.36053857,"top":0.05387071,"width":0.0787899,"height":0.023144454},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Code","depth":11,"bounds":{"left":0.36619017,"top":0.09936153,"width":0.025099734,"height":0.026336791},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Code","depth":13,"bounds":{"left":0.37682846,"top":0.10574621,"width":0.011801862,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Issues","depth":11,"bounds":{"left":0.39394948,"top":0.09936153,"width":0.027593086,"height":0.026336791},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Issues","depth":13,"bounds":{"left":0.40492022,"top":0.10574621,"width":0.013630319,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Pull requests (2)","depth":11,"bounds":{"left":0.4242021,"top":0.09936153,"width":0.052526597,"height":0.026336791},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests","depth":13,"bounds":{"left":0.43567154,"top":0.10574621,"width":0.027759308,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":13,"bounds":{"left":0.46692154,"top":0.113727055,"width":0.0029920214,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":13,"bounds":{"left":0.46991357,"top":0.113727055,"width":0.0026595744,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":13,"bounds":{"left":0.47257313,"top":0.113727055,"width":0.0018284575,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Agents","depth":11,"bounds":{"left":0.4793883,"top":0.09936153,"width":0.029089095,"height":0.026336791},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Agents","depth":13,"bounds":{"left":0.49035904,"top":0.10574621,"width":0.014960106,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Actions","depth":11,"bounds":{"left":0.51113695,"top":0.09936153,"width":0.03025266,"height":0.026336791},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Actions","depth":13,"bounds":{"left":0.52227396,"top":0.10574621,"width":0.015957447,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Projects","depth":11,"bounds":{"left":0.5440492,"top":0.09936153,"width":0.03174867,"height":0.026336791},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Projects","depth":13,"bounds":{"left":0.55518615,"top":0.10574621,"width":0.017453458,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Security and quality","depth":11,"bounds":{"left":0.5784575,"top":0.09936153,"width":0.05817819,"height":0.026336791},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Security and quality","depth":13,"bounds":{"left":0.5902593,"top":0.10574621,"width":0.04255319,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Insights","depth":11,"bounds":{"left":0.6392952,"top":0.09936153,"width":0.03125,"height":0.026336791},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Insights","depth":13,"bounds":{"left":0.65043217,"top":0.10574621,"width":0.016788565,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Important update","depth":9,"bounds":{"left":0.37450132,"top":0.14365523,"width":0.0003324468,"height":0.016759777},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Important update","depth":10,"bounds":{"left":0.37450132,"top":0.1452514,"width":0.039228722,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.","depth":9,"bounds":{"left":0.37450132,"top":0.1452514,"width":0.2159242,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Review this update","depth":9,"bounds":{"left":0.59042555,"top":0.1452514,"width":0.04055851,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Review this update","depth":10,"bounds":{"left":0.59042555,"top":0.1452514,"width":0.04055851,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and manage your preferences in your","depth":9,"bounds":{"left":0.63098407,"top":0.1452514,"width":0.08261303,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"GitHub account settings","depth":9,"bounds":{"left":0.71359706,"top":0.1452514,"width":0.05219415,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"GitHub account settings","depth":10,"bounds":{"left":0.71359706,"top":0.1452514,"width":0.05219415,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".","depth":9,"bounds":{"left":0.76579124,"top":0.1452514,"width":0.0013297872,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Dismiss banner","depth":8,"bounds":{"left":0.98636967,"top":0.13886672,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"mcp-fathom-server","depth":16,"bounds":{"left":0.48902926,"top":0.18515563,"width":0.060339097,"height":0.023942538},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"mcp-fathom-server","depth":17,"bounds":{"left":0.48902926,"top":0.18754987,"width":0.060339097,"height":0.01915403},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Public","depth":16,"bounds":{"left":0.554355,"top":0.19114126,"width":0.011801862,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Read github.githubassets.com","depth":5,"bounds":{"left":0.3622008,"top":0.9876297,"width":0.05269282,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-3950708075789458082
|
-4332463302487919713
|
click
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {"status":"error","message":"You have reached your secondly limit.","errorType":"RATE_LIMIT
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {"status":"error","message":"You have reached your secondly limit.","errorType":"RATE_LIMIT
[JY-20372] AI Reports > Empty page design and promotion - Jira
[JY-20372] AI Reports > Empty page design and promotion - Jira
Jiminny MCP Connector - Product - Confluence
Jiminny MCP Connector - Product - Confluence
Jiminny
Jiminny
Workers | Datadog
Workers | Datadog
Pull requests · jiminny/app
Pull requests · jiminny/app
[JY-20728] [HubSpot] Find the root cause of 429 hit and tweak API client rate limiter - Jira
[JY-20728] [HubSpot] Find the root cause of 429 hit and tweak API client rate limiter - Jira
JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app
JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app
Jiminny
Jiminny
CloudWatch | us-east-2
CloudWatch | us-east-2
Your 'Not enpough activities' report wasn't generated - [EMAIL] - Jiminny Mail
Your 'Not enpough activities' report wasn't generated - [EMAIL] - Jiminny Mail
Jiminny MCP Connector - Product - Confluence
Jiminny MCP Connector - Product - Confluence
sourcegate/mcp-fathom-server
sourcegate/mcp-fathom-server
Close tab
JY-9712 | change nudges schema by nikolaybiaivanov · Pull Request #11983 · jiminny/app
JY-9712 | change nudges schema by nikolaybiaivanov · Pull Request #11983 · jiminny/app
JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app
JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app
Architecture overview - Model Context Protocol
Architecture overview - Model Context Protocol
Laravel MCP - AI tooling for Laravel, by the Laravel team | Laravel - The clean stack for Artisans and agents
Laravel MCP - AI tooling for Laravel, by the Laravel team | Laravel - The clean stack for Artisans and agents
Laravel MCP | Laravel 13.x - The clean stack for Artisans and agents
Laravel MCP | Laravel 13.x - The clean stack for Artisans and agents
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Skip to content
Skip to content
Open menu
Homepage (g then d)
sourcegate
sourcegate
mcp-fathom-server
mcp-fathom-server
Search or jump to…
Type
/
to search
Chat with Copilot
Open Copilot…
Create new...
Issues
Pull requests
Repositories
You have no unread notifications(g then n)
Open user navigation menu
Repository navigation
Repository navigation
Code
Code
Issues
Issues
Pull requests (2)
Pull requests
(
2
)
Agents
Agents
Actions
Actions
Projects
Projects
Security and quality
Security and quality
Insights
Insights
Important update
Important update
On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.
Review this update
Review this update
and manage your preferences in your
GitHub account settings
GitHub account settings
.
Dismiss banner
mcp-fathom-server
mcp-fathom-server
Public
Read github.githubassets.com...
|
NULL
|
NULL
|
|
72375
|
1764
|
2
|
2026-04-22T15:39:58.994827+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-22/1776 /Users/lukas/.screenpipe/data/data/2026-04-22/1776872398994_m1.jpg...
|
Firefox
|
sourcegate/mcp-fathom-server — Work
|
1
|
github.com/sourcegate/mcp-fathom-server
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST [URL_WITH_CREDENTIALS] dist/index.js
Copy
🐛 Troubleshooting
🐛 Troubleshooting
Permalink: 🐛 Troubleshooting
Issue
Solution
Server won't start
Check that your API key is correctly set
No results found
Try broader search terms or check your API key permissions
Rate limiting
The server handles this automatically - wait a moment and try again
Claude can't find tools
Ensure Claude Desktop is restarted after config changes
Issue
Server won't start
No results found
Rate limiting
Claude can't find tools...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"SevenShores\\Hubspot\\Exceptions\\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SevenShores\\Hubspot\\Exceptions\\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20372] AI Reports > Empty page design and promotion - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20372] AI Reports > Empty page design and promotion - Jira","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny MCP Connector - Product - Confluence","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny MCP Connector - Product - Confluence","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Workers | Datadog","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Workers | Datadog","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pull requests · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20728] [HubSpot] Find the root cause of 429 hit and tweak API client rate limiter - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20728] [HubSpot] Find the root cause of 429 hit and tweak API client rate limiter - Jira","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"CloudWatch | us-east-2","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"CloudWatch | us-east-2","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Your 'Not enpough activities' report wasn't generated - lukas.kovalik@jiminny.com - Jiminny Mail","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Your 'Not enpough activities' report wasn't generated - lukas.kovalik@jiminny.com - Jiminny Mail","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny MCP Connector - Product - Confluence","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny MCP Connector - Product - Confluence","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"sourcegate/mcp-fathom-server","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"sourcegate/mcp-fathom-server","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"JY-9712 | change nudges schema by nikolaybiaivanov · Pull Request #11983 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-9712 | change nudges schema by nikolaybiaivanov · Pull Request #11983 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Architecture overview - Model Context Protocol","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Architecture overview - Model Context Protocol","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Laravel MCP - AI tooling for Laravel, by the Laravel team | Laravel - The clean stack for Artisans and agents","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Laravel MCP - AI tooling for Laravel, by the Laravel team | Laravel - The clean stack for Artisans and agents","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Laravel MCP | Laravel 13.x - The clean stack for Artisans and agents","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Laravel MCP | Laravel 13.x - The clean stack for Artisans and agents","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.028819444,"top":0.0,"width":0.022222223,"height":0.035555556},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.051736113,"top":0.0,"width":0.022222223,"height":0.035555556},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.075,"top":0.0,"width":0.022222223,"height":0.035555556},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.09826389,"top":0.0,"width":0.022222223,"height":0.035555556},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.121527776,"top":0.0,"width":0.022222223,"height":0.035555556},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Skip to content","depth":6,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to content","depth":7,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open menu","depth":10,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Homepage (g then d)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"sourcegate","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"mcp-fathom-server","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"mcp-fathom-server","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Search or jump to…","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Type","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"to search","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Chat with Copilot","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Open Copilot…","depth":9,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"Create new...","depth":9,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Issues","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Pull requests","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Repositories","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"You have unread notifications(g then n)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Open user navigation menu","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Repository navigation","depth":9,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Repository navigation","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Code","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Code","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Issues","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Issues","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Pull requests (2)","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Agents","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Agents","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Actions","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Actions","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Projects","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Projects","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Security and quality","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Security and quality","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Insights","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Insights","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Important update","depth":10,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Important update","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Review this update","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Review this update","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and manage your preferences in your","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"GitHub account settings","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"GitHub account settings","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Dismiss banner","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"mcp-fathom-server","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"mcp-fathom-server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Public","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Watch: Participating in sourcegate/mcp-fathom-server","depth":19,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Watch","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fork 4","depth":17,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fork","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"See your forks of this repository","depth":18,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Star this repository (8)","depth":18,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Star","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Add this repository to a list","depth":19,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"sourcegate/mcp-fathom-server","depth":13,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"sourcegate/mcp-fathom-server","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"main branch","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"main","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"1 Branch","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"1","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Branch","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"0 Tags","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"0","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Tags","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXComboBox","text":"Go to file","depth":13,"role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"Add file","depth":12,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Add file","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Add file","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Add file","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Code","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Code","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Folders and files","depth":12,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Folders and files","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Name","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit message","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit date","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"src, (Directory)","depth":18,"help_text":"src","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"src","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":16,"help_text":"Fix Claude integration: Add stub handlers for resources and prompts - Added ListResourcesRequestSchema and ListPromptsRequestSchema handlers - Return empty arrays to prevent 'Method not found' errors - Updated server capabilities to include resources and prompts - Fixes Claude treating server as broken due to optional endpoint errors","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".env.example, (File)","depth":18,"help_text":".env.example","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".env.example","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".gitignore, (File)","depth":18,"help_text":".gitignore","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".gitignore","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Performance optimization: Fix search timeouts","depth":16,"help_text":"Performance optimization: Fix search timeouts - Limited search to last 30 days instead of all meetings - Disabled transcript search by default (was causing 1.6MB+ responses) - Added logging for better debugging visibility - Updated tool descriptions to clarify limitations - Removed dangerous pagination loop that fetched all meetings Fixes timeout issues when searching for meetings with transcripts","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Performance optimization: Fix search timeouts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"LICENSE, (File)","depth":18,"help_text":"LICENSE","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"LICENSE","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"README.md, (File)","depth":18,"help_text":"README.md","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"README.md","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"Update README with GitHub integration status Add testing status note to confirm GitHub app integration is working correctly. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"claude-config-example.json, (File)","depth":18,"help_text":"claude-config-example.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude-config-example.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package-lock.json, (File)","depth":18,"help_text":"package-lock.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package-lock.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package.json, (File)","depth":18,"help_text":"package.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"tsconfig.json, (File)","depth":18,"help_text":"tsconfig.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"tsconfig.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Name","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"src, (Directory)","depth":18,"help_text":"src","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"src","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".env.example, (File)","depth":18,"help_text":".env.example","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".env.example","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".gitignore, (File)","depth":18,"help_text":".gitignore","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".gitignore","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"LICENSE, (File)","depth":18,"help_text":"LICENSE","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"LICENSE","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"README.md, (File)","depth":18,"help_text":"README.md","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"README.md","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"claude-config-example.json, (File)","depth":18,"help_text":"claude-config-example.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude-config-example.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package-lock.json, (File)","depth":18,"help_text":"package-lock.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package-lock.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package.json, (File)","depth":18,"help_text":"package.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"tsconfig.json, (File)","depth":18,"help_text":"tsconfig.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"tsconfig.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit message","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":16,"help_text":"Fix Claude integration: Add stub handlers for resources and prompts - Added ListResourcesRequestSchema and ListPromptsRequestSchema handlers - Return empty arrays to prevent 'Method not found' errors - Updated server capabilities to include resources and prompts - Fixes Claude treating server as broken due to optional endpoint errors","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Performance optimization: Fix search timeouts","depth":16,"help_text":"Performance optimization: Fix search timeouts - Limited search to last 30 days instead of all meetings - Disabled transcript search by default (was causing 1.6MB+ responses) - Added logging for better debugging visibility - Updated tool descriptions to clarify limitations - Removed dangerous pagination loop that fetched all meetings Fixes timeout issues when searching for meetings with transcripts","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Performance optimization: Fix search timeouts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"Update README with GitHub integration status Add testing status note to confirm GitHub app integration is working correctly. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit date","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Repository files navigation","depth":13,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Repository files navigation","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"README","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"README","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"MIT license","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"MIT license","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Edit file","depth":13,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Outline","depth":13,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"MCP Fathom Server","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"MCP Fathom Server","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: MCP Fathom Server","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"An MCP (Model Context Protocol) server that integrates with Fathom AI's meeting API, enabling Claude to search and retrieve meeting information through natural language queries.","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"MCP","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Node.js","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"TypeScript","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"🎯 Features","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🎯 Features","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🎯 Features","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"🔍 Smart Search","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Natural language search across meeting titles, summaries, transcripts, and action items","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"📋 List Meetings","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Retrieve meetings with various filters (attendees, date ranges, teams, etc.)","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"📝 Transcript Support","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Optionally include full meeting transcripts in search results","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"⚡ Real-time","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Direct integration with Fathom's API for up-to-date meeting data","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🛡️ Secure","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": API key management through environment variables","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🚀 Quick Start","depth":14,"bounds":{"left":0.4576389,"top":0.0,"width":0.54236114,"height":0.04222222},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🚀 Quick Start","depth":15,"bounds":{"left":0.4576389,"top":0.0,"width":0.10555556,"height":0.035},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🚀 Quick Start","depth":14,"bounds":{"left":0.43819445,"top":0.0,"width":0.019444445,"height":0.031111112},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Prerequisites","depth":14,"bounds":{"left":0.4576389,"top":0.0,"width":0.54236114,"height":0.027777778},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Prerequisites","depth":15,"bounds":{"left":0.4576389,"top":0.0,"width":0.084027775,"height":0.026666667},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: Prerequisites","depth":14,"bounds":{"left":0.43819445,"top":0.0,"width":0.019444445,"height":0.031111112},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Node.js 18 or higher","depth":16,"bounds":{"left":0.4798611,"top":0.02388889,"width":0.10138889,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"npm or yarn","depth":16,"bounds":{"left":0.4798611,"top":0.055,"width":0.060763888,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"A Fathom AI account with API access","depth":16,"bounds":{"left":0.4798611,"top":0.08611111,"width":0.18715277,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Claude Desktop app","depth":16,"bounds":{"left":0.4798611,"top":0.11722222,"width":0.10243055,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Installation","depth":14,"bounds":{"left":0.4576389,"top":0.16777778,"width":0.54236114,"height":0.027777778},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Installation","depth":15,"bounds":{"left":0.4576389,"top":0.16833334,"width":0.07013889,"height":0.026666667},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: Installation","depth":14,"bounds":{"left":0.43819445,"top":0.16611111,"width":0.019444445,"height":0.031111112},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Clone and setup","depth":17,"bounds":{"left":0.4798611,"top":0.21611111,"width":0.08541667,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"bounds":{"left":0.56527776,"top":0.21611111,"width":0.003125,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"git clone https://github.com/sourcegate/mcp-fathom-server.git","depth":16,"bounds":{"left":0.46875,"top":0.27722222,"width":0.34652779,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"cd","depth":16,"bounds":{"left":0.46875,"top":0.29944444,"width":0.011111111,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"mcp-fathom-server\nnpm install\nnpm run build","depth":16,"bounds":{"left":0.46875,"top":0.29944444,"width":0.11354167,"height":0.062222224},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"bounds":{"left":1.0,"top":0.26666668,"width":-0.014583349,"height":0.031111112},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Configure your API key","depth":17,"bounds":{"left":0.4798611,"top":0.40166667,"width":0.12048611,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"bounds":{"left":0.6003472,"top":0.40166667,"width":0.003125,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"cp .env.example .env","depth":16,"bounds":{"left":0.46875,"top":0.46277776,"width":0.11354167,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":16,"bounds":{"left":0.46875,"top":0.48444444,"width":0.0055555557,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Edit .env and add your Fathom API key","depth":16,"bounds":{"left":0.47430557,"top":0.48444444,"width":0.21597221,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"bounds":{"left":1.0,"top":0.45222223,"width":-0.014583349,"height":0.031111112},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Get your Fathom API key","depth":18,"bounds":{"left":0.4798611,"top":0.54333335,"width":0.12951389,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":17,"bounds":{"left":0.609375,"top":0.54333335,"width":0.003125,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Log in to","depth":18,"bounds":{"left":0.50208336,"top":0.5877778,"width":0.046875,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fathom","depth":18,"bounds":{"left":0.54895836,"top":0.5877778,"width":0.0375,"height":0.02111111},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fathom","depth":19,"bounds":{"left":0.54895836,"top":0.5877778,"width":0.0375,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Go to Settings → API","depth":18,"bounds":{"left":0.50208336,"top":0.6188889,"width":0.10520833,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Generate a new API key","depth":18,"bounds":{"left":0.50208336,"top":0.62222224,"width":0.119791664,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Copy it to your","depth":18,"bounds":{"left":0.50208336,"top":0.6533333,"width":0.077083334,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".env","depth":19,"bounds":{"left":0.5829861,"top":0.6561111,"width":0.022916667,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"file","depth":18,"bounds":{"left":0.6097222,"top":0.6533333,"width":0.018055556,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Add to Claude Desktop","depth":18,"bounds":{"left":0.4798611,"top":0.69777775,"width":0.12118056,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":17,"bounds":{"left":0.6010417,"top":0.69777775,"width":0.003125,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Edit your Claude Desktop configuration file:","depth":15,"bounds":{"left":0.4576389,"top":0.74222225,"width":0.21909723,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"macOS","depth":17,"bounds":{"left":0.4798611,"top":0.7866667,"width":0.03784722,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"bounds":{"left":0.51770836,"top":0.7866667,"width":0.00625,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"~/Library/Application Support/Claude/claude_desktop_config.json","depth":17,"bounds":{"left":0.52743053,"top":0.78944445,"width":0.35833332,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Windows","depth":17,"bounds":{"left":0.4798611,"top":0.81777775,"width":0.047916666,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"bounds":{"left":0.5277778,"top":0.81777775,"width":0.00625,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"%APPDATA%\\Claude\\claude_desktop_config.json","depth":17,"bounds":{"left":0.5378472,"top":0.82055557,"width":0.24444444,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"{","depth":16,"bounds":{"left":0.46875,"top":0.8788889,"width":0.011111111,"height":0.04},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"mcpServers\"","depth":16,"bounds":{"left":0.4798611,"top":0.90055555,"width":0.068402775,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": {","depth":16,"bounds":{"left":0.46875,"top":0.90055555,"width":0.09652778,"height":0.040555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"fathom\"","depth":16,"bounds":{"left":0.49131945,"top":0.9227778,"width":0.04548611,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": {","depth":16,"bounds":{"left":0.46875,"top":0.9227778,"width":0.08506945,"height":0.04},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"command\"","depth":16,"bounds":{"left":0.50277776,"top":0.9444444,"width":0.051041666,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"bounds":{"left":0.5538194,"top":0.9444444,"width":0.011458334,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"bounds":{"left":0.56527776,"top":0.9444444,"width":0.0055555557,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"node","depth":16,"bounds":{"left":0.5708333,"top":0.9444444,"width":0.022916667,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"bounds":{"left":0.59375,"top":0.9444444,"width":0.0055555557,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":",","depth":16,"bounds":{"left":0.46875,"top":0.9444444,"width":0.13611111,"height":0.040555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"args\"","depth":16,"bounds":{"left":0.50277776,"top":0.96666664,"width":0.034027778,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": [","depth":16,"bounds":{"left":0.53680557,"top":0.96666664,"width":0.017013889,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"bounds":{"left":0.5538194,"top":0.96666664,"width":0.0055555557,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/absolute/path/to/mcp-fathom-server/dist/index.js","depth":16,"bounds":{"left":0.559375,"top":0.96666664,"width":0.27847221,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"bounds":{"left":0.83784723,"top":0.96666664,"width":0.005902778,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"],","depth":16,"bounds":{"left":0.46875,"top":0.96666664,"width":0.3861111,"height":0.03333336},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"env\"","depth":16,"bounds":{"left":0.50277776,"top":0.98833334,"width":0.028472222,"height":0.011666656},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": {","depth":16,"bounds":{"left":0.46875,"top":0.98833334,"width":0.07951389,"height":0.011666656},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"FATHOM_API_KEY\"","depth":16,"bounds":{"left":0.5138889,"top":1.0,"width":0.09097222,"height":-0.00999999},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"bounds":{"left":0.60486114,"top":1.0,"width":0.011458334,"height":-0.00999999},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"bounds":{"left":0.6163194,"top":1.0,"width":0.0055555557,"height":-0.00999999},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"your-api-key-here","depth":16,"bounds":{"left":0.621875,"top":1.0,"width":0.096875,"height":-0.00999999},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"bounds":{"left":0.71875,"top":1.0,"width":0.0055555557,"height":-0.00999999},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"}\n }\n }\n}","depth":16,"bounds":{"left":0.46875,"top":1.0,"width":0.039583333,"height":-0.03222227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"bounds":{"left":1.0,"top":0.845,"width":-0.014583349,"height":0.031111112},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Restart Claude Desktop","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and you're ready to go! 🎉","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"💬 Usage Examples","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"💬 Usage Examples","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 💬 Usage Examples","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Once configured, you can ask Claude natural language questions about your meetings:","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"Find me meetings about recruiting\"\n\"Show me all external meetings from last week\" \n\"Search for meetings where we discussed product launches\"\n\"List meetings with john@example.com\"\n\"Find meetings with action items about hiring\"\n\"What did we discuss in our Q1 planning meetings?\"","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Claude will automatically choose the right tool and search method based on your query.","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🔧 Available Tools","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🔧 Available Tools","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🔧 Available Tools","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"list_meetings","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"list_meetings","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: list_meetings","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Retrieves meetings with optional filters:","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"calendar_invitees","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by attendee emails","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"calendar_invitees_domains","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by company domains","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"created_after","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"created_before","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Date range filters","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"meeting_type","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": all, internal, or external","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"include_transcript","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Include full transcripts","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"recorded_by","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by meeting owner","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"teams","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by team names","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"search_meetings","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"search_meetings","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: search_meetings","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Searches meetings by keywords:","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"search_term","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": The keyword/phrase to search for","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"include_transcript","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Search within transcripts (slower but more comprehensive)","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🛠️ Development","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🛠️ Development","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🛠️ Development","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"#","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Run in development mode","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"npm run dev","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Build for production","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"npm run build","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Test with MCP Inspector","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"npx @modelcontextprotocol/inspector dist/index.js","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"🐛 Troubleshooting","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🐛 Troubleshooting","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🐛 Troubleshooting","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Issue","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Solution","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Server won't start","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Check that your API key is correctly set","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"No results found","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Try broader search terms or check your API key permissions","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Rate limiting","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"The server handles this automatically - wait a moment and try again","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Claude can't find tools","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ensure Claude Desktop is restarted after config changes","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Issue","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Server won't start","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"No results found","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Rate limiting","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Claude can't find tools","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
6381971009815308900
|
-4913595457851464002
|
click
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST [URL_WITH_CREDENTIALS] dist/index.js
Copy
🐛 Troubleshooting
🐛 Troubleshooting
Permalink: 🐛 Troubleshooting
Issue
Solution
Server won't start
Check that your API key is correctly set
No results found
Try broader search terms or check your API key permissions
Rate limiting
The server handles this automatically - wait a moment and try again
Claude can't find tools
Ensure Claude Desktop is restarted after config changes
Issue
Server won't start
No results found
Rate limiting
Claude can't find tools...
|
72372
|
NULL
|
|
72376
|
1765
|
5
|
2026-04-22T15:40:01.407820+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-22/1776 /Users/lukas/.screenpipe/data/data/2026-04-22/1776872401407_m2.jpg...
|
Firefox
|
sourcegate/mcp-fathom-server — Work
|
1
|
github.com/sourcegate/mcp-fathom-server
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST [URL_WITH_CREDENTIALS] dist/index.js
Copy
🐛 Troubleshooting
🐛 Troubleshooting
Permalink: 🐛 Troubleshooting
Issue
Solution
Server won't start
Check that your API key is correctly set
No results found
Try broader search terms or check your API key permissions
Rate limiting
The server handles this automatically - wait a moment and try again
Claude can't find tools
Ensure Claude Desktop is restarted after config changes
Issue
Server won't start
No results found
Rate limiting
Claude can't find tools
Solution
Check that your API key is correctly set
Try broader search terms or check your API key permissions
The server handles this automatically - wait a moment and try again
Ensure Claude Desktop is restarted after config changes
📄 License
📄 License
Permalink: 📄 License
MIT License - see
LICENSE
LICENSE
file for details.
🤝 Contributing
🤝 Contributing
Permalink: 🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
🙋♀️ Support
🙋♀️ Support
Permalink: 🙋♀️ Support...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"bounds":{"left":0.28307846,"top":0.0518755,"width":0.07596409,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"SevenShores\\Hubspot\\Exceptions\\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT","depth":4,"bounds":{"left":0.28125,"top":0.09497207,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SevenShores\\Hubspot\\Exceptions\\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT","depth":5,"bounds":{"left":0.2945479,"top":0.10614525,"width":0.4644282,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20372] AI Reports > Empty page design and promotion - Jira","depth":4,"bounds":{"left":0.28125,"top":0.12769353,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20372] AI Reports > Empty page design and promotion - Jira","depth":5,"bounds":{"left":0.2945479,"top":0.13886672,"width":0.11319814,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny MCP Connector - Product - Confluence","depth":4,"bounds":{"left":0.28125,"top":0.16041501,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny MCP Connector - Product - Confluence","depth":5,"bounds":{"left":0.2945479,"top":0.17158818,"width":0.08294548,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.28125,"top":0.19313647,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"bounds":{"left":0.2945479,"top":0.20430966,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Workers | Datadog","depth":4,"bounds":{"left":0.28125,"top":0.22585794,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Workers | Datadog","depth":5,"bounds":{"left":0.2945479,"top":0.23703113,"width":0.032081116,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pull requests · jiminny/app","depth":4,"bounds":{"left":0.28125,"top":0.2585794,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests · jiminny/app","depth":5,"bounds":{"left":0.2945479,"top":0.2697526,"width":0.04537899,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20728] [HubSpot] Find the root cause of 429 hit and tweak API client rate limiter - Jira","depth":4,"bounds":{"left":0.28125,"top":0.29130086,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20728] [HubSpot] Find the root cause of 429 hit and tweak API client rate limiter - Jira","depth":5,"bounds":{"left":0.2945479,"top":0.30247405,"width":0.15791224,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":4,"bounds":{"left":0.28125,"top":0.32402235,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":5,"bounds":{"left":0.2945479,"top":0.33519554,"width":0.16555852,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.28125,"top":0.3567438,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"bounds":{"left":0.2945479,"top":0.367917,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"CloudWatch | us-east-2","depth":4,"bounds":{"left":0.28125,"top":0.38946527,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"CloudWatch | us-east-2","depth":5,"bounds":{"left":0.2945479,"top":0.40063846,"width":0.041223403,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Your 'Not enpough activities' report wasn't generated - lukas.kovalik@jiminny.com - Jiminny Mail","depth":4,"bounds":{"left":0.28125,"top":0.42218676,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Your 'Not enpough activities' report wasn't generated - lukas.kovalik@jiminny.com - Jiminny Mail","depth":5,"bounds":{"left":0.2945479,"top":0.43335995,"width":0.16821809,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny MCP Connector - Product - Confluence","depth":4,"bounds":{"left":0.28125,"top":0.45490822,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny MCP Connector - Product - Confluence","depth":5,"bounds":{"left":0.2945479,"top":0.4660814,"width":0.08294548,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"sourcegate/mcp-fathom-server","depth":4,"bounds":{"left":0.28125,"top":0.48762968,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"sourcegate/mcp-fathom-server","depth":5,"bounds":{"left":0.2945479,"top":0.49880287,"width":0.0546875,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.34857047,"top":0.49481246,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"JY-9712 | change nudges schema by nikolaybiaivanov · Pull Request #11983 · jiminny/app","depth":4,"bounds":{"left":0.28125,"top":0.5203512,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-9712 | change nudges schema by nikolaybiaivanov · Pull Request #11983 · jiminny/app","depth":5,"bounds":{"left":0.2945479,"top":0.53152436,"width":0.15475398,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":4,"bounds":{"left":0.28125,"top":0.55307263,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":5,"bounds":{"left":0.2945479,"top":0.5642458,"width":0.16555852,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Architecture overview - Model Context Protocol","depth":4,"bounds":{"left":0.28125,"top":0.5857941,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Architecture overview - Model Context Protocol","depth":5,"bounds":{"left":0.2945479,"top":0.5969673,"width":0.08277926,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Laravel MCP - AI tooling for Laravel, by the Laravel team | Laravel - The clean stack for Artisans and agents","depth":4,"bounds":{"left":0.28125,"top":0.61851555,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Laravel MCP - AI tooling for Laravel, by the Laravel team | Laravel - The clean stack for Artisans and agents","depth":5,"bounds":{"left":0.2945479,"top":0.62968874,"width":0.18583776,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Laravel MCP | Laravel 13.x - The clean stack for Artisans and agents","depth":4,"bounds":{"left":0.28125,"top":0.651237,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Laravel MCP | Laravel 13.x - The clean stack for Artisans and agents","depth":5,"bounds":{"left":0.2945479,"top":0.6624102,"width":0.1178524,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.2840758,"top":0.6855547,"width":0.07413564,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.2840758,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.29504654,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.30618352,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.31732047,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.32845744,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Skip to content","depth":6,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to content","depth":7,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open menu","depth":10,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Homepage (g then d)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"sourcegate","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"mcp-fathom-server","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"mcp-fathom-server","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Search or jump to…","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Type","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"to search","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Chat with Copilot","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Open Copilot…","depth":9,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"Create new...","depth":9,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Issues","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Pull requests","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Repositories","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"You have unread notifications(g then n)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Open user navigation menu","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Repository navigation","depth":9,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Repository navigation","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Code","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Code","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Issues","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Issues","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Pull requests (2)","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Agents","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Agents","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Actions","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Actions","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Projects","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Projects","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Security and quality","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Security and quality","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Insights","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Insights","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Important update","depth":10,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Important update","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Review this update","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Review this update","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and manage your preferences in your","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"GitHub account settings","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"GitHub account settings","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Dismiss banner","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"mcp-fathom-server","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"mcp-fathom-server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Public","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Watch: Participating in sourcegate/mcp-fathom-server","depth":19,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Watch","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fork 4","depth":17,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fork","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"See your forks of this repository","depth":18,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Star this repository (8)","depth":18,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Star","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Add this repository to a list","depth":19,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"sourcegate/mcp-fathom-server","depth":13,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"sourcegate/mcp-fathom-server","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"main branch","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"main","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"1 Branch","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"1","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Branch","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"0 Tags","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"0","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Tags","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXComboBox","text":"Go to file","depth":13,"role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"Add file","depth":12,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Add file","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Add file","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Add file","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Code","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Code","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Folders and files","depth":12,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Folders and files","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Name","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit message","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit date","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"src, (Directory)","depth":18,"help_text":"src","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"src","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":16,"help_text":"Fix Claude integration: Add stub handlers for resources and prompts - Added ListResourcesRequestSchema and ListPromptsRequestSchema handlers - Return empty arrays to prevent 'Method not found' errors - Updated server capabilities to include resources and prompts - Fixes Claude treating server as broken due to optional endpoint errors","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".env.example, (File)","depth":18,"help_text":".env.example","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".env.example","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".gitignore, (File)","depth":18,"help_text":".gitignore","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".gitignore","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Performance optimization: Fix search timeouts","depth":16,"help_text":"Performance optimization: Fix search timeouts - Limited search to last 30 days instead of all meetings - Disabled transcript search by default (was causing 1.6MB+ responses) - Added logging for better debugging visibility - Updated tool descriptions to clarify limitations - Removed dangerous pagination loop that fetched all meetings Fixes timeout issues when searching for meetings with transcripts","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Performance optimization: Fix search timeouts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"LICENSE, (File)","depth":18,"help_text":"LICENSE","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"LICENSE","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"README.md, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.0,"width":0.026928192,"height":0.013567438},"help_text":"README.md","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"README.md","depth":19,"bounds":{"left":0.49268618,"top":0.0,"width":0.026928192,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"bounds":{"left":0.60388964,"top":0.0,"width":0.1015625,"height":0.013567438},"help_text":"Update README with GitHub integration status Add testing status note to confirm GitHub app integration is working correctly. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"bounds":{"left":0.60388964,"top":0.0,"width":0.1015625,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.0,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"claude-config-example.json, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.0,"width":0.06000665,"height":0.013567438},"help_text":"claude-config-example.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude-config-example.json","depth":19,"bounds":{"left":0.49268618,"top":0.0,"width":0.06000665,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"bounds":{"left":0.60388964,"top":0.0,"width":0.07795878,"height":0.013567438},"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"bounds":{"left":0.60388964,"top":0.0,"width":0.07795878,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.0,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package-lock.json, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.0,"width":0.039228722,"height":0.013567438},"help_text":"package-lock.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package-lock.json","depth":19,"bounds":{"left":0.49268618,"top":0.0,"width":0.039228722,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"bounds":{"left":0.60388964,"top":0.0,"width":0.07795878,"height":0.013567438},"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"bounds":{"left":0.60388964,"top":0.0,"width":0.07795878,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.0,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package.json, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.017956903,"width":0.02825798,"height":0.013567438},"help_text":"package.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package.json","depth":19,"bounds":{"left":0.49268618,"top":0.017956903,"width":0.02825798,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"bounds":{"left":0.60388964,"top":0.017956903,"width":0.07795878,"height":0.013567438},"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"bounds":{"left":0.60388964,"top":0.017956903,"width":0.07795878,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.017956903,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"tsconfig.json, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.050678372,"width":0.027593086,"height":0.013567438},"help_text":"tsconfig.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"tsconfig.json","depth":19,"bounds":{"left":0.49268618,"top":0.050678372,"width":0.027593086,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"bounds":{"left":0.60388964,"top":0.050678372,"width":0.07795878,"height":0.013567438},"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"bounds":{"left":0.60388964,"top":0.050678372,"width":0.07795878,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.050678372,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Name","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"src, (Directory)","depth":18,"help_text":"src","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"src","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".env.example, (File)","depth":18,"help_text":".env.example","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".env.example","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".gitignore, (File)","depth":18,"help_text":".gitignore","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".gitignore","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"LICENSE, (File)","depth":18,"help_text":"LICENSE","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"LICENSE","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"README.md, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.0,"width":0.026928192,"height":0.013567438},"help_text":"README.md","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"README.md","depth":19,"bounds":{"left":0.49268618,"top":0.0,"width":0.026928192,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"claude-config-example.json, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.0,"width":0.06000665,"height":0.013567438},"help_text":"claude-config-example.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude-config-example.json","depth":19,"bounds":{"left":0.49268618,"top":0.0,"width":0.06000665,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package-lock.json, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.0,"width":0.039228722,"height":0.013567438},"help_text":"package-lock.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package-lock.json","depth":19,"bounds":{"left":0.49268618,"top":0.0,"width":0.039228722,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package.json, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.017956903,"width":0.02825798,"height":0.013567438},"help_text":"package.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package.json","depth":19,"bounds":{"left":0.49268618,"top":0.017956903,"width":0.02825798,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"tsconfig.json, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.050678372,"width":0.027593086,"height":0.013567438},"help_text":"tsconfig.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"tsconfig.json","depth":19,"bounds":{"left":0.49268618,"top":0.050678372,"width":0.027593086,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit message","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":16,"help_text":"Fix Claude integration: Add stub handlers for resources and prompts - Added ListResourcesRequestSchema and ListPromptsRequestSchema handlers - Return empty arrays to prevent 'Method not found' errors - Updated server capabilities to include resources and prompts - Fixes Claude treating server as broken due to optional endpoint errors","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Performance optimization: Fix search timeouts","depth":16,"help_text":"Performance optimization: Fix search timeouts - Limited search to last 30 days instead of all meetings - Disabled transcript search by default (was causing 1.6MB+ responses) - Added logging for better debugging visibility - Updated tool descriptions to clarify limitations - Removed dangerous pagination loop that fetched all meetings Fixes timeout issues when searching for meetings with transcripts","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Performance optimization: Fix search timeouts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"bounds":{"left":0.60388964,"top":0.0,"width":0.1015625,"height":0.013567438},"help_text":"Update README with GitHub integration status Add testing status note to confirm GitHub app integration is working correctly. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"bounds":{"left":0.60388964,"top":0.0,"width":0.1015625,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"bounds":{"left":0.60388964,"top":0.0,"width":0.07795878,"height":0.013567438},"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"bounds":{"left":0.60388964,"top":0.0,"width":0.07795878,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"bounds":{"left":0.60388964,"top":0.0,"width":0.07795878,"height":0.013567438},"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"bounds":{"left":0.60388964,"top":0.0,"width":0.07795878,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"bounds":{"left":0.60388964,"top":0.017956903,"width":0.07795878,"height":0.013567438},"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"bounds":{"left":0.60388964,"top":0.017956903,"width":0.07795878,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"bounds":{"left":0.60388964,"top":0.050678372,"width":0.07795878,"height":0.013567438},"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"bounds":{"left":0.60388964,"top":0.050678372,"width":0.07795878,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit date","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.0,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.0,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.0,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.017956903,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.050678372,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Repository files navigation","depth":13,"bounds":{"left":0.47839096,"top":0.10614525,"width":0.0003324468,"height":0.0007980846},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Repository files navigation","depth":14,"bounds":{"left":0.47839096,"top":0.108938545,"width":0.095578454,"height":0.023144454},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"README","depth":16,"bounds":{"left":0.48138297,"top":0.09377494,"width":0.03274601,"height":0.026336791},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"README","depth":18,"bounds":{"left":0.49202126,"top":0.100159615,"width":0.019448139,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"MIT license","depth":16,"bounds":{"left":0.51678854,"top":0.09377494,"width":0.03873005,"height":0.026336791},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"MIT license","depth":18,"bounds":{"left":0.52792555,"top":0.100159615,"width":0.02443484,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Edit file","depth":13,"bounds":{"left":0.75265956,"top":0.09537111,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Outline","depth":13,"bounds":{"left":0.76462764,"top":0.09377494,"width":0.011303191,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"MCP Fathom Server","depth":14,"bounds":{"left":0.4893617,"top":0.15163608,"width":0.2785904,"height":0.04030327},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"MCP Fathom Server","depth":15,"bounds":{"left":0.4893617,"top":0.15243416,"width":0.095744684,"height":0.030327214},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: MCP Fathom Server","depth":14,"bounds":{"left":0.4800532,"top":0.15682362,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"An MCP (Model Context Protocol) server that integrates with Fathom AI's meeting API, enabling Claude to search and retrieve meeting information through natural language queries.","depth":15,"bounds":{"left":0.4893617,"top":0.20670392,"width":0.27293882,"height":0.03431764},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"MCP","depth":15,"bounds":{"left":0.4893617,"top":0.25937748,"width":0.03523936,"height":0.015163607},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Node.js","depth":15,"bounds":{"left":0.52609706,"top":0.25937748,"width":0.027925532,"height":0.015163607},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"TypeScript","depth":15,"bounds":{"left":0.5555186,"top":0.25937748,"width":0.03523936,"height":0.015163607},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"🎯 Features","depth":14,"bounds":{"left":0.4893617,"top":0.29569036,"width":0.2785904,"height":0.030726258},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🎯 Features","depth":15,"bounds":{"left":0.4893617,"top":0.29569036,"width":0.04138963,"height":0.025139665},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🎯 Features","depth":14,"bounds":{"left":0.4800532,"top":0.29608938,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"🔍 Smart Search","depth":17,"bounds":{"left":0.5,"top":0.34078214,"width":0.04105718,"height":0.016759777},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Natural language search across meeting titles, summaries, transcripts, and action items","depth":16,"bounds":{"left":0.54105717,"top":0.34118116,"width":0.21442819,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"📋 List Meetings","depth":17,"bounds":{"left":0.5,"top":0.36312848,"width":0.040724736,"height":0.016759777},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Retrieve meetings with various filters (attendees, date ranges, teams, etc.)","depth":16,"bounds":{"left":0.54072475,"top":0.36352754,"width":0.18267952,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"📝 Transcript Support","depth":17,"bounds":{"left":0.5,"top":0.38547486,"width":0.05435505,"height":0.016759777},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Optionally include full meeting transcripts in search results","depth":16,"bounds":{"left":0.554355,"top":0.3858739,"width":0.14444813,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"⚡ Real-time","depth":17,"bounds":{"left":0.5,"top":0.40782124,"width":0.031083776,"height":0.016759777},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Direct integration with Fathom's API for up-to-date meeting data","depth":16,"bounds":{"left":0.53108376,"top":0.40822026,"width":0.15890957,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🛡️ Secure","depth":17,"bounds":{"left":0.5,"top":0.4301676,"width":0.02443484,"height":0.016759777},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": API key management through environment variables","depth":16,"bounds":{"left":0.52443486,"top":0.43056664,"width":0.12865691,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🚀 Quick Start","depth":14,"bounds":{"left":0.4893617,"top":0.4668795,"width":0.2785904,"height":0.030327214},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🚀 Quick Start","depth":15,"bounds":{"left":0.4893617,"top":0.4668795,"width":0.050531916,"height":0.025139665},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🚀 Quick Start","depth":14,"bounds":{"left":0.4800532,"top":0.4668795,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Prerequisites","depth":14,"bounds":{"left":0.4893617,"top":0.51636076,"width":0.2785904,"height":0.019952115},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Prerequisites","depth":15,"bounds":{"left":0.4893617,"top":0.51675975,"width":0.040226065,"height":0.01915403},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: Prerequisites","depth":14,"bounds":{"left":0.4800532,"top":0.5151636,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Node.js 18 or higher","depth":16,"bounds":{"left":0.5,"top":0.5510774,"width":0.048537236,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"npm or yarn","depth":16,"bounds":{"left":0.5,"top":0.5734238,"width":0.029089095,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"A Fathom AI account with API access","depth":16,"bounds":{"left":0.5,"top":0.5957702,"width":0.08959442,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Claude Desktop app","depth":16,"bounds":{"left":0.5,"top":0.6181165,"width":0.049035903,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Installation","depth":14,"bounds":{"left":0.4893617,"top":0.6544294,"width":0.2785904,"height":0.019952115},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Installation","depth":15,"bounds":{"left":0.4893617,"top":0.6548284,"width":0.03357713,"height":0.01915403},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: Installation","depth":14,"bounds":{"left":0.4800532,"top":0.6532322,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Clone and setup","depth":17,"bounds":{"left":0.5,"top":0.68914604,"width":0.04089096,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"bounds":{"left":0.54089093,"top":0.68914604,"width":0.0014960107,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"git clone https://github.com/sourcegate/mcp-fathom-server.git","depth":16,"bounds":{"left":0.49468085,"top":0.7330407,"width":0.16589096,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"cd","depth":16,"bounds":{"left":0.49468085,"top":0.7490024,"width":0.005319149,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"mcp-fathom-server\nnpm install\nnpm run build","depth":16,"bounds":{"left":0.49468085,"top":0.7490024,"width":0.05435505,"height":0.044692736},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"bounds":{"left":0.75598407,"top":0.7254589,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Configure your API key","depth":17,"bounds":{"left":0.5,"top":0.8224262,"width":0.057679523,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"bounds":{"left":0.55767953,"top":0.8224262,"width":0.0014960107,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"cp .env.example .env","depth":16,"bounds":{"left":0.49468085,"top":0.86632085,"width":0.05435505,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":16,"bounds":{"left":0.49468085,"top":0.8818835,"width":0.0026595744,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Edit .env and add your Fathom API key","depth":16,"bounds":{"left":0.4973404,"top":0.8818835,"width":0.103390954,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"bounds":{"left":0.75598407,"top":0.858739,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Get your Fathom API key","depth":18,"bounds":{"left":0.5,"top":0.92418194,"width":0.06200133,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":17,"bounds":{"left":0.56200135,"top":0.92418194,"width":0.0014960107,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Log in to","depth":18,"bounds":{"left":0.5106383,"top":0.95610535,"width":0.02244016,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fathom","depth":18,"bounds":{"left":0.53307843,"top":0.95610535,"width":0.017952127,"height":0.015163607},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fathom","depth":19,"bounds":{"left":0.53307843,"top":0.95610535,"width":0.017952127,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Go to Settings → API","depth":18,"bounds":{"left":0.5106383,"top":0.9784517,"width":0.05036569,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Generate a new API key","depth":18,"bounds":{"left":0.5106383,"top":1.0,"width":0.057347074,"height":-0.0007981062},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Copy it to your","depth":18,"bounds":{"left":0.5106383,"top":1.0,"width":0.036901597,"height":-0.023144484},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".env","depth":19,"bounds":{"left":0.5493683,"top":1.0,"width":0.010970744,"height":-0.02513969},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"file","depth":18,"bounds":{"left":0.5621675,"top":1.0,"width":0.008643617,"height":-0.023144484},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Add to Claude Desktop","depth":18,"bounds":{"left":0.5,"top":1.0,"width":0.058011968,"height":-0.055067778},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":17,"bounds":{"left":0.55801195,"top":1.0,"width":0.0014960107,"height":-0.055067778},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Edit your Claude Desktop configuration file:","depth":15,"bounds":{"left":0.4893617,"top":1.0,"width":0.10488697,"height":-0.08699119},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"macOS","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"~/Library/Application Support/Claude/claude_desktop_config.json","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Windows","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"%APPDATA%\\Claude\\claude_desktop_config.json","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"{","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"mcpServers\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": {","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"fathom\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": {","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"command\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"node","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":",","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"args\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": [","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/absolute/path/to/mcp-fathom-server/dist/index.js","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"],","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"env\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": {","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"FATHOM_API_KEY\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"your-api-key-here","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"}\n }\n }\n}","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Restart Claude Desktop","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and you're ready to go! 🎉","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"💬 Usage Examples","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"💬 Usage Examples","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 💬 Usage Examples","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Once configured, you can ask Claude natural language questions about your meetings:","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"Find me meetings about recruiting\"\n\"Show me all external meetings from last week\" \n\"Search for meetings where we discussed product launches\"\n\"List meetings with john@example.com\"\n\"Find meetings with action items about hiring\"\n\"What did we discuss in our Q1 planning meetings?\"","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Claude will automatically choose the right tool and search method based on your query.","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🔧 Available Tools","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🔧 Available Tools","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🔧 Available Tools","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"list_meetings","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"list_meetings","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: list_meetings","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Retrieves meetings with optional filters:","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"calendar_invitees","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by attendee emails","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"calendar_invitees_domains","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by company domains","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"created_after","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"created_before","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Date range filters","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"meeting_type","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": all, internal, or external","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"include_transcript","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Include full transcripts","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"recorded_by","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by meeting owner","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"teams","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by team names","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"search_meetings","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"search_meetings","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: search_meetings","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Searches meetings by keywords:","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"search_term","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": The keyword/phrase to search for","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"include_transcript","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Search within transcripts (slower but more comprehensive)","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🛠️ Development","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🛠️ Development","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🛠️ Development","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"#","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Run in development mode","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"npm run dev","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Build for production","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"npm run build","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Test with MCP Inspector","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"npx @modelcontextprotocol/inspector dist/index.js","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"🐛 Troubleshooting","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🐛 Troubleshooting","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🐛 Troubleshooting","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Issue","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Solution","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Server won't start","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Check that your API key is correctly set","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"No results found","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Try broader search terms or check your API key permissions","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Rate limiting","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"The server handles this automatically - wait a moment and try again","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Claude can't find tools","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ensure Claude Desktop is restarted after config changes","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Issue","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Server won't start","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"No results found","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Rate limiting","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Claude can't find tools","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Solution","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Check that your API key is correctly set","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Try broader search terms or check your API key permissions","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"The server handles this automatically - wait a moment and try again","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ensure Claude Desktop is restarted after config changes","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"📄 License","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"📄 License","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 📄 License","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"MIT License - see","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"LICENSE","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"LICENSE","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"file for details.","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🤝 Contributing","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🤝 Contributing","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🤝 Contributing","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🙋♀️ Support","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🙋♀️ Support","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🙋♀️ Support","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false}]...
|
146982220379975408
|
-4913630650813487170
|
visual_change
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST [URL_WITH_CREDENTIALS] dist/index.js
Copy
🐛 Troubleshooting
🐛 Troubleshooting
Permalink: 🐛 Troubleshooting
Issue
Solution
Server won't start
Check that your API key is correctly set
No results found
Try broader search terms or check your API key permissions
Rate limiting
The server handles this automatically - wait a moment and try again
Claude can't find tools
Ensure Claude Desktop is restarted after config changes
Issue
Server won't start
No results found
Rate limiting
Claude can't find tools
Solution
Check that your API key is correctly set
Try broader search terms or check your API key permissions
The server handles this automatically - wait a moment and try again
Ensure Claude Desktop is restarted after config changes
📄 License
📄 License
Permalink: 📄 License
MIT License - see
LICENSE
LICENSE
file for details.
🤝 Contributing
🤝 Contributing
Permalink: 🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
🙋♀️ Support
🙋♀️ Support
Permalink: 🙋♀️ Support...
|
72374
|
NULL
|
|
72377
|
1764
|
3
|
2026-04-22T15:40:31.163616+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-22/1776 /Users/lukas/.screenpipe/data/data/2026-04-22/1776872431163_m1.jpg...
|
Firefox
|
sourcegate/mcp-fathom-server — Work
|
1
|
github.com/sourcegate/mcp-fathom-server
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST [URL_WITH_CREDENTIALS] dist/index.js
Copy
🐛 Troubleshooting
🐛 Troubleshooting
Permalink: 🐛 Troubleshooting
Issue
Solution
Server won't start
Check that your API key is correctly set
No results found
Try broader search terms or check your API key permissions
Rate limiting
The server handles this automatically - wait a moment and try again
Claude can't find tools
Ensure Claude Desktop is restarted after config changes
Issue
Server won't start
No results found
Rate limiting
Claude can't find tools
Solution
Check that your API key is correctly set
Try broader search terms or check your API key permissions
The server handles this automatically - wait a moment and try again
Ensure Claude Desktop is restarted after config changes
📄 License
📄 License
Permalink: 📄 License
MIT License - see
LICENSE
LICENSE
file for details.
🤝 Contributing
🤝 Contributing
Permalink: 🤝 Contributing...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"SevenShores\\Hubspot\\Exceptions\\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SevenShores\\Hubspot\\Exceptions\\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20372] AI Reports > Empty page design and promotion - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20372] AI Reports > Empty page design and promotion - Jira","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny MCP Connector - Product - Confluence","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny MCP Connector - Product - Confluence","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Workers | Datadog","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Workers | Datadog","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pull requests · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20728] [HubSpot] Find the root cause of 429 hit and tweak API client rate limiter - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20728] [HubSpot] Find the root cause of 429 hit and tweak API client rate limiter - Jira","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"CloudWatch | us-east-2","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"CloudWatch | us-east-2","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Your 'Not enpough activities' report wasn't generated - lukas.kovalik@jiminny.com - Jiminny Mail","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Your 'Not enpough activities' report wasn't generated - lukas.kovalik@jiminny.com - Jiminny Mail","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny MCP Connector - Product - Confluence","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny MCP Connector - Product - Confluence","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"sourcegate/mcp-fathom-server","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"sourcegate/mcp-fathom-server","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"JY-9712 | change nudges schema by nikolaybiaivanov · Pull Request #11983 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-9712 | change nudges schema by nikolaybiaivanov · Pull Request #11983 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Architecture overview - Model Context Protocol","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Architecture overview - Model Context Protocol","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Laravel MCP - AI tooling for Laravel, by the Laravel team | Laravel - The clean stack for Artisans and agents","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Laravel MCP - AI tooling for Laravel, by the Laravel team | Laravel - The clean stack for Artisans and agents","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Laravel MCP | Laravel 13.x - The clean stack for Artisans and agents","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Laravel MCP | Laravel 13.x - The clean stack for Artisans and agents","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.028819444,"top":0.0,"width":0.022222223,"height":0.035555556},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.051736113,"top":0.0,"width":0.022222223,"height":0.035555556},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.075,"top":0.0,"width":0.022222223,"height":0.035555556},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.09826389,"top":0.0,"width":0.022222223,"height":0.035555556},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.121527776,"top":0.0,"width":0.022222223,"height":0.035555556},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Skip to content","depth":6,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to content","depth":7,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open menu","depth":10,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Homepage (g then d)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"sourcegate","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"mcp-fathom-server","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"mcp-fathom-server","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Search or jump to…","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Type","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"to search","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Chat with Copilot","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Open Copilot…","depth":9,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"Create new...","depth":9,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Issues","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Pull requests","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Repositories","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"You have unread notifications(g then n)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Open user navigation menu","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Repository navigation","depth":9,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Repository navigation","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Code","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Code","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Issues","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Issues","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Pull requests (2)","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Agents","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Agents","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Actions","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Actions","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Projects","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Projects","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Security and quality","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Security and quality","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Insights","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Insights","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Important update","depth":10,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Important update","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Review this update","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Review this update","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and manage your preferences in your","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"GitHub account settings","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"GitHub account settings","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Dismiss banner","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"mcp-fathom-server","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"mcp-fathom-server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Public","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Watch: Participating in sourcegate/mcp-fathom-server","depth":19,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Watch","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fork 4","depth":17,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fork","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"See your forks of this repository","depth":18,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Star this repository (8)","depth":18,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Star","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Add this repository to a list","depth":19,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"sourcegate/mcp-fathom-server","depth":13,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"sourcegate/mcp-fathom-server","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"main branch","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"main","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"1 Branch","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"1","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Branch","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"0 Tags","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"0","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Tags","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXComboBox","text":"Go to file","depth":13,"role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"Add file","depth":12,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Add file","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Add file","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Add file","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Code","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Code","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Folders and files","depth":12,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Folders and files","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Name","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit message","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit date","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"src, (Directory)","depth":18,"help_text":"src","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"src","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":16,"help_text":"Fix Claude integration: Add stub handlers for resources and prompts - Added ListResourcesRequestSchema and ListPromptsRequestSchema handlers - Return empty arrays to prevent 'Method not found' errors - Updated server capabilities to include resources and prompts - Fixes Claude treating server as broken due to optional endpoint errors","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".env.example, (File)","depth":18,"help_text":".env.example","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".env.example","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".gitignore, (File)","depth":18,"help_text":".gitignore","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".gitignore","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Performance optimization: Fix search timeouts","depth":16,"help_text":"Performance optimization: Fix search timeouts - Limited search to last 30 days instead of all meetings - Disabled transcript search by default (was causing 1.6MB+ responses) - Added logging for better debugging visibility - Updated tool descriptions to clarify limitations - Removed dangerous pagination loop that fetched all meetings Fixes timeout issues when searching for meetings with transcripts","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Performance optimization: Fix search timeouts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"LICENSE, (File)","depth":18,"help_text":"LICENSE","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"LICENSE","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"README.md, (File)","depth":18,"help_text":"README.md","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"README.md","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"Update README with GitHub integration status Add testing status note to confirm GitHub app integration is working correctly. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"claude-config-example.json, (File)","depth":18,"help_text":"claude-config-example.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude-config-example.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package-lock.json, (File)","depth":18,"help_text":"package-lock.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package-lock.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package.json, (File)","depth":18,"help_text":"package.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"tsconfig.json, (File)","depth":18,"help_text":"tsconfig.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"tsconfig.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Name","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"src, (Directory)","depth":18,"help_text":"src","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"src","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".env.example, (File)","depth":18,"help_text":".env.example","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".env.example","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".gitignore, (File)","depth":18,"help_text":".gitignore","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".gitignore","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"LICENSE, (File)","depth":18,"help_text":"LICENSE","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"LICENSE","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"README.md, (File)","depth":18,"help_text":"README.md","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"README.md","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"claude-config-example.json, (File)","depth":18,"help_text":"claude-config-example.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude-config-example.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package-lock.json, (File)","depth":18,"help_text":"package-lock.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package-lock.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package.json, (File)","depth":18,"help_text":"package.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"tsconfig.json, (File)","depth":18,"help_text":"tsconfig.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"tsconfig.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit message","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":16,"help_text":"Fix Claude integration: Add stub handlers for resources and prompts - Added ListResourcesRequestSchema and ListPromptsRequestSchema handlers - Return empty arrays to prevent 'Method not found' errors - Updated server capabilities to include resources and prompts - Fixes Claude treating server as broken due to optional endpoint errors","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Performance optimization: Fix search timeouts","depth":16,"help_text":"Performance optimization: Fix search timeouts - Limited search to last 30 days instead of all meetings - Disabled transcript search by default (was causing 1.6MB+ responses) - Added logging for better debugging visibility - Updated tool descriptions to clarify limitations - Removed dangerous pagination loop that fetched all meetings Fixes timeout issues when searching for meetings with transcripts","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Performance optimization: Fix search timeouts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"Update README with GitHub integration status Add testing status note to confirm GitHub app integration is working correctly. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit date","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Repository files navigation","depth":13,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Repository files navigation","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"README","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"README","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"MIT license","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"MIT license","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Edit file","depth":13,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Outline","depth":13,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"MCP Fathom Server","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"MCP Fathom Server","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: MCP Fathom Server","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"An MCP (Model Context Protocol) server that integrates with Fathom AI's meeting API, enabling Claude to search and retrieve meeting information through natural language queries.","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"MCP","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Node.js","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"TypeScript","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"🎯 Features","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🎯 Features","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🎯 Features","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"🔍 Smart Search","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Natural language search across meeting titles, summaries, transcripts, and action items","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"📋 List Meetings","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Retrieve meetings with various filters (attendees, date ranges, teams, etc.)","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"📝 Transcript Support","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Optionally include full meeting transcripts in search results","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"⚡ Real-time","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Direct integration with Fathom's API for up-to-date meeting data","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🛡️ Secure","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": API key management through environment variables","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🚀 Quick Start","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🚀 Quick Start","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🚀 Quick Start","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Prerequisites","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Prerequisites","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: Prerequisites","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Node.js 18 or higher","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"npm or yarn","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"A Fathom AI account with API access","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Claude Desktop app","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Installation","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Installation","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: Installation","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Clone and setup","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"git clone https://github.com/sourcegate/mcp-fathom-server.git","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"cd","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"mcp-fathom-server\nnpm install\nnpm run build","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Configure your API key","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"cp .env.example .env","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Edit .env and add your Fathom API key","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Get your Fathom API key","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Log in to","depth":18,"bounds":{"left":0.50208336,"top":0.0,"width":0.046875,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fathom","depth":18,"bounds":{"left":0.54895836,"top":0.0,"width":0.0375,"height":0.02111111},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fathom","depth":19,"bounds":{"left":0.54895836,"top":0.0,"width":0.0375,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Go to Settings → API","depth":18,"bounds":{"left":0.50208336,"top":0.0,"width":0.10520833,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Generate a new API key","depth":18,"bounds":{"left":0.50208336,"top":0.0011111111,"width":0.119791664,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Copy it to your","depth":18,"bounds":{"left":0.50208336,"top":0.032222223,"width":0.077083334,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".env","depth":19,"bounds":{"left":0.5829861,"top":0.035,"width":0.022916667,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"file","depth":18,"bounds":{"left":0.6097222,"top":0.032222223,"width":0.018055556,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Add to Claude Desktop","depth":18,"bounds":{"left":0.4798611,"top":0.07666667,"width":0.12118056,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":17,"bounds":{"left":0.6010417,"top":0.07666667,"width":0.003125,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Edit your Claude Desktop configuration file:","depth":15,"bounds":{"left":0.4576389,"top":0.12111111,"width":0.21909723,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"macOS","depth":17,"bounds":{"left":0.4798611,"top":0.16555555,"width":0.03784722,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"bounds":{"left":0.51770836,"top":0.16555555,"width":0.00625,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"~/Library/Application Support/Claude/claude_desktop_config.json","depth":17,"bounds":{"left":0.52743053,"top":0.16833334,"width":0.35833332,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Windows","depth":17,"bounds":{"left":0.4798611,"top":0.19666667,"width":0.047916666,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"bounds":{"left":0.5277778,"top":0.19666667,"width":0.00625,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"%APPDATA%\\Claude\\claude_desktop_config.json","depth":17,"bounds":{"left":0.5378472,"top":0.19944444,"width":0.24444444,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"{","depth":16,"bounds":{"left":0.46875,"top":0.25777778,"width":0.011111111,"height":0.04},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"mcpServers\"","depth":16,"bounds":{"left":0.4798611,"top":0.27944446,"width":0.068402775,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": {","depth":16,"bounds":{"left":0.46875,"top":0.27944446,"width":0.09652778,"height":0.040555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"fathom\"","depth":16,"bounds":{"left":0.49131945,"top":0.30166668,"width":0.04548611,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": {","depth":16,"bounds":{"left":0.46875,"top":0.30166668,"width":0.08506945,"height":0.04},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"command\"","depth":16,"bounds":{"left":0.50277776,"top":0.32333332,"width":0.051041666,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"bounds":{"left":0.5538194,"top":0.32333332,"width":0.011458334,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"bounds":{"left":0.56527776,"top":0.32333332,"width":0.0055555557,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"node","depth":16,"bounds":{"left":0.5708333,"top":0.32333332,"width":0.022916667,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"bounds":{"left":0.59375,"top":0.32333332,"width":0.0055555557,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":",","depth":16,"bounds":{"left":0.46875,"top":0.32333332,"width":0.13611111,"height":0.040555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"args\"","depth":16,"bounds":{"left":0.50277776,"top":0.34555554,"width":0.034027778,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": [","depth":16,"bounds":{"left":0.53680557,"top":0.34555554,"width":0.017013889,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"bounds":{"left":0.5538194,"top":0.34555554,"width":0.0055555557,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/absolute/path/to/mcp-fathom-server/dist/index.js","depth":16,"bounds":{"left":0.559375,"top":0.34555554,"width":0.27847221,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"bounds":{"left":0.83784723,"top":0.34555554,"width":0.005902778,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"],","depth":16,"bounds":{"left":0.46875,"top":0.34555554,"width":0.3861111,"height":0.04},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"env\"","depth":16,"bounds":{"left":0.50277776,"top":0.36722222,"width":0.028472222,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": {","depth":16,"bounds":{"left":0.46875,"top":0.36722222,"width":0.07951389,"height":0.04},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"FATHOM_API_KEY\"","depth":16,"bounds":{"left":0.5138889,"top":0.3888889,"width":0.09097222,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"bounds":{"left":0.60486114,"top":0.3888889,"width":0.011458334,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"bounds":{"left":0.6163194,"top":0.3888889,"width":0.0055555557,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"your-api-key-here","depth":16,"bounds":{"left":0.621875,"top":0.3888889,"width":0.096875,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"bounds":{"left":0.71875,"top":0.3888889,"width":0.0055555557,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"}\n }\n }\n}","depth":16,"bounds":{"left":0.46875,"top":0.41111112,"width":0.039583333,"height":0.08388889},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"bounds":{"left":1.0,"top":0.24722221,"width":-0.014583349,"height":0.031111112},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Restart Claude Desktop","depth":17,"bounds":{"left":0.4798611,"top":0.535,"width":0.125,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and you're ready to go! 🎉","depth":16,"bounds":{"left":0.60486114,"top":0.53444445,"width":0.134375,"height":0.023333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"💬 Usage Examples","depth":14,"bounds":{"left":0.4576389,"top":0.58555555,"width":0.54236114,"height":0.042777777},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"💬 Usage Examples","depth":15,"bounds":{"left":0.4576389,"top":0.58555555,"width":0.14548612,"height":0.035},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 💬 Usage Examples","depth":14,"bounds":{"left":0.43819445,"top":0.5861111,"width":0.019444445,"height":0.031111112},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Once configured, you can ask Claude natural language questions about your meetings:","depth":15,"bounds":{"left":0.4576389,"top":0.6488889,"width":0.43784723,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"Find me meetings about recruiting\"\n\"Show me all external meetings from last week\" \n\"Search for meetings where we discussed product launches\"\n\"List meetings with john@example.com\"\n\"Find meetings with action items about hiring\"\n\"What did we discuss in our Q1 planning meetings?\"","depth":17,"bounds":{"left":0.46875,"top":0.71,"width":0.3236111,"height":0.12777779},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"bounds":{"left":1.0,"top":0.6994445,"width":-0.014583349,"height":0.031111112},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Claude will automatically choose the right tool and search method based on your query.","depth":15,"bounds":{"left":0.4576389,"top":0.87777776,"width":0.4420139,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🔧 Available Tools","depth":14,"bounds":{"left":0.4576389,"top":0.92833334,"width":0.54236114,"height":0.042777777},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🔧 Available Tools","depth":15,"bounds":{"left":0.4576389,"top":0.92833334,"width":0.13229166,"height":0.035},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🔧 Available Tools","depth":14,"bounds":{"left":0.43819445,"top":0.9288889,"width":0.019444445,"height":0.031111112},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"list_meetings","depth":14,"bounds":{"left":0.4576389,"top":0.99777776,"width":0.54236114,"height":0.00222224},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"list_meetings","depth":16,"bounds":{"left":0.46041667,"top":0.9988889,"width":0.108333334,"height":0.0011110902},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: list_meetings","depth":14,"bounds":{"left":0.43819445,"top":0.9961111,"width":0.019444445,"height":0.003888905},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Retrieves meetings with optional filters:","depth":15,"bounds":{"left":0.4576389,"top":1.0,"width":0.19826388,"height":-0.046666622},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"calendar_invitees","depth":17,"bounds":{"left":0.48333332,"top":1.0,"width":0.096875,"height":-0.09388888},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by attendee emails","depth":16,"bounds":{"left":0.58368057,"top":1.0,"width":0.12986112,"height":-0.091111064},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"calendar_invitees_domains","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by company domains","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"created_after","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"created_before","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Date range filters","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"meeting_type","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": all, internal, or external","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"include_transcript","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Include full transcripts","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"recorded_by","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by meeting owner","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"teams","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by team names","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"search_meetings","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"search_meetings","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: search_meetings","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Searches meetings by keywords:","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"search_term","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": The keyword/phrase to search for","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"include_transcript","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Search within transcripts (slower but more comprehensive)","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🛠️ Development","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🛠️ Development","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🛠️ Development","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"#","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Run in development mode","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"npm run dev","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Build for production","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"npm run build","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Test with MCP Inspector","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"npx @modelcontextprotocol/inspector dist/index.js","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"🐛 Troubleshooting","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🐛 Troubleshooting","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🐛 Troubleshooting","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Issue","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Solution","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Server won't start","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Check that your API key is correctly set","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"No results found","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Try broader search terms or check your API key permissions","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Rate limiting","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"The server handles this automatically - wait a moment and try again","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Claude can't find tools","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ensure Claude Desktop is restarted after config changes","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Issue","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Server won't start","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"No results found","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Rate limiting","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Claude can't find tools","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Solution","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Check that your API key is correctly set","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Try broader search terms or check your API key permissions","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"The server handles this automatically - wait a moment and try again","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ensure Claude Desktop is restarted after config changes","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"📄 License","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"📄 License","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 📄 License","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"MIT License - see","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"LICENSE","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"LICENSE","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"file for details.","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🤝 Contributing","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🤝 Contributing","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🤝 Contributing","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false}]...
|
2039905061210896513
|
-4913595457851463746
|
idle
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST [URL_WITH_CREDENTIALS] dist/index.js
Copy
🐛 Troubleshooting
🐛 Troubleshooting
Permalink: 🐛 Troubleshooting
Issue
Solution
Server won't start
Check that your API key is correctly set
No results found
Try broader search terms or check your API key permissions
Rate limiting
The server handles this automatically - wait a moment and try again
Claude can't find tools
Ensure Claude Desktop is restarted after config changes
Issue
Server won't start
No results found
Rate limiting
Claude can't find tools
Solution
Check that your API key is correctly set
Try broader search terms or check your API key permissions
The server handles this automatically - wait a moment and try again
Ensure Claude Desktop is restarted after config changes
📄 License
📄 License
Permalink: 📄 License
MIT License - see
LICENSE
LICENSE
file for details.
🤝 Contributing
🤝 Contributing
Permalink: 🤝 Contributing...
|
NULL
|
NULL
|
|
72378
|
1765
|
6
|
2026-04-22T15:40:33.576455+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-22/1776 /Users/lukas/.screenpipe/data/data/2026-04-22/1776872433576_m2.jpg...
|
Firefox
|
sourcegate/mcp-fathom-server — Work
|
1
|
github.com/sourcegate/mcp-fathom-server
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST [URL_WITH_CREDENTIALS] dist/index.js
Copy
🐛 Troubleshooting
🐛 Troubleshooting
Permalink: 🐛 Troubleshooting
Issue
Solution
Server won't start
Check that your API key is correctly set
No results found
Try broader search terms or check your API key permissions
Rate limiting
The server handles this automatically - wait a moment and try again
Claude can't find tools
Ensure Claude Desktop is restarted after config changes
Issue
Server won't start
No results found
Rate limiting
Claude can't find tools
Solution
Check that your API key is correctly set
Try broader search terms or check your API key permissions
The server handles this automatically - wait a moment and try again
Ensure Claude Desktop is restarted after config changes
📄 License
📄 License
Permalink: 📄 License
MIT License - see
LICENSE
LICENSE
file for details.
🤝 Contributing
🤝 Contributing
Permalink: 🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
🙋♀️ Support
🙋♀️ Support
Permalink: 🙋♀️ Support
If you encounter any issues:
Check the
troubleshooting section
troubleshooting section
Search existing
GitHub issues
GitHub issues
Create a new issue with detailed information about your problem
Status
: Tested and working with GitHub integration ✓
Built for fun by
@petesena
@petesena
❤️
About
About
No description, website, or topics provided.
Resources
Resources
Readme
Readme
License
License
MIT license
MIT license
Activity
Activity
Stars
Stars
8 stars
8
stars
Watchers
Watchers
0 watching
0
watching
Forks
Forks
4 forks
4
forks
Report repository
Report repository
Releases
Releases
Releases
No releases published
Packages
Packages
Packages
No packages published
Contributors 2
Contributors 2
Contributors
2
@sourcegate
sourcegate
sourcegate
@claude
claude Claude
claude
Claude
Languages
Languages
JavaScript 57.8%
JavaScript
57.8%
TypeScript 42.2%
TypeScript
42.2%
Footer
Footer
GitHub Homepage
© 2026 GitHub, Inc.
Footer navigation
Footer navigation
Terms
Terms
Privacy
Privacy
Security
Security
Status...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"bounds":{"left":0.28307846,"top":0.0518755,"width":0.07596409,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"SevenShores\\Hubspot\\Exceptions\\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT","depth":4,"bounds":{"left":0.28125,"top":0.09497207,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SevenShores\\Hubspot\\Exceptions\\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT","depth":5,"bounds":{"left":0.2945479,"top":0.10614525,"width":0.4644282,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20372] AI Reports > Empty page design and promotion - Jira","depth":4,"bounds":{"left":0.28125,"top":0.12769353,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20372] AI Reports > Empty page design and promotion - Jira","depth":5,"bounds":{"left":0.2945479,"top":0.13886672,"width":0.11319814,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny MCP Connector - Product - Confluence","depth":4,"bounds":{"left":0.28125,"top":0.16041501,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny MCP Connector - Product - Confluence","depth":5,"bounds":{"left":0.2945479,"top":0.17158818,"width":0.08294548,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.28125,"top":0.19313647,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"bounds":{"left":0.2945479,"top":0.20430966,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Workers | Datadog","depth":4,"bounds":{"left":0.28125,"top":0.22585794,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Workers | Datadog","depth":5,"bounds":{"left":0.2945479,"top":0.23703113,"width":0.032081116,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pull requests · jiminny/app","depth":4,"bounds":{"left":0.28125,"top":0.2585794,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests · jiminny/app","depth":5,"bounds":{"left":0.2945479,"top":0.2697526,"width":0.04537899,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20728] [HubSpot] Find the root cause of 429 hit and tweak API client rate limiter - Jira","depth":4,"bounds":{"left":0.28125,"top":0.29130086,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20728] [HubSpot] Find the root cause of 429 hit and tweak API client rate limiter - Jira","depth":5,"bounds":{"left":0.2945479,"top":0.30247405,"width":0.15791224,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":4,"bounds":{"left":0.28125,"top":0.32402235,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":5,"bounds":{"left":0.2945479,"top":0.33519554,"width":0.16555852,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.28125,"top":0.3567438,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"bounds":{"left":0.2945479,"top":0.367917,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"CloudWatch | us-east-2","depth":4,"bounds":{"left":0.28125,"top":0.38946527,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"CloudWatch | us-east-2","depth":5,"bounds":{"left":0.2945479,"top":0.40063846,"width":0.041223403,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Your 'Not enpough activities' report wasn't generated - lukas.kovalik@jiminny.com - Jiminny Mail","depth":4,"bounds":{"left":0.28125,"top":0.42218676,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Your 'Not enpough activities' report wasn't generated - lukas.kovalik@jiminny.com - Jiminny Mail","depth":5,"bounds":{"left":0.2945479,"top":0.43335995,"width":0.16821809,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny MCP Connector - Product - Confluence","depth":4,"bounds":{"left":0.28125,"top":0.45490822,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny MCP Connector - Product - Confluence","depth":5,"bounds":{"left":0.2945479,"top":0.4660814,"width":0.08294548,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"sourcegate/mcp-fathom-server","depth":4,"bounds":{"left":0.28125,"top":0.48762968,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"sourcegate/mcp-fathom-server","depth":5,"bounds":{"left":0.2945479,"top":0.49880287,"width":0.0546875,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.34857047,"top":0.49481246,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"JY-9712 | change nudges schema by nikolaybiaivanov · Pull Request #11983 · jiminny/app","depth":4,"bounds":{"left":0.28125,"top":0.5203512,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-9712 | change nudges schema by nikolaybiaivanov · Pull Request #11983 · jiminny/app","depth":5,"bounds":{"left":0.2945479,"top":0.53152436,"width":0.15475398,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":4,"bounds":{"left":0.28125,"top":0.55307263,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":5,"bounds":{"left":0.2945479,"top":0.5642458,"width":0.16555852,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Architecture overview - Model Context Protocol","depth":4,"bounds":{"left":0.28125,"top":0.5857941,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Architecture overview - Model Context Protocol","depth":5,"bounds":{"left":0.2945479,"top":0.5969673,"width":0.08277926,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Laravel MCP - AI tooling for Laravel, by the Laravel team | Laravel - The clean stack for Artisans and agents","depth":4,"bounds":{"left":0.28125,"top":0.61851555,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Laravel MCP - AI tooling for Laravel, by the Laravel team | Laravel - The clean stack for Artisans and agents","depth":5,"bounds":{"left":0.2945479,"top":0.62968874,"width":0.18583776,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Laravel MCP | Laravel 13.x - The clean stack for Artisans and agents","depth":4,"bounds":{"left":0.28125,"top":0.651237,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Laravel MCP | Laravel 13.x - The clean stack for Artisans and agents","depth":5,"bounds":{"left":0.2945479,"top":0.6624102,"width":0.1178524,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.2840758,"top":0.6855547,"width":0.07413564,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.2840758,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.29504654,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.30618352,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.31732047,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.32845744,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Skip to content","depth":6,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to content","depth":7,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open menu","depth":10,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Homepage (g then d)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"sourcegate","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"mcp-fathom-server","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"mcp-fathom-server","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Search or jump to…","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Type","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"to search","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Chat with Copilot","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Open Copilot…","depth":9,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"Create new...","depth":9,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Issues","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Pull requests","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Repositories","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"You have unread notifications(g then n)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Open user navigation menu","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Repository navigation","depth":9,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Repository navigation","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Code","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Code","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Issues","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Issues","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Pull requests (2)","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Agents","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Agents","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Actions","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Actions","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Projects","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Projects","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Security and quality","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Security and quality","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Insights","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Insights","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Important update","depth":10,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Important update","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Review this update","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Review this update","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and manage your preferences in your","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"GitHub account settings","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"GitHub account settings","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Dismiss banner","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"mcp-fathom-server","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"mcp-fathom-server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Public","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Watch: Participating in sourcegate/mcp-fathom-server","depth":19,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Watch","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fork 4","depth":17,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fork","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"See your forks of this repository","depth":18,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Star this repository (8)","depth":18,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Star","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Add this repository to a list","depth":19,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"sourcegate/mcp-fathom-server","depth":13,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"sourcegate/mcp-fathom-server","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"main branch","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"main","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"1 Branch","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"1","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Branch","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"0 Tags","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"0","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Tags","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXComboBox","text":"Go to file","depth":13,"role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"Add file","depth":12,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Add file","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Add file","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Add file","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Code","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Code","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Folders and files","depth":12,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Folders and files","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Name","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit message","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit date","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"src, (Directory)","depth":18,"help_text":"src","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"src","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":16,"help_text":"Fix Claude integration: Add stub handlers for resources and prompts - Added ListResourcesRequestSchema and ListPromptsRequestSchema handlers - Return empty arrays to prevent 'Method not found' errors - Updated server capabilities to include resources and prompts - Fixes Claude treating server as broken due to optional endpoint errors","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".env.example, (File)","depth":18,"help_text":".env.example","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".env.example","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".gitignore, (File)","depth":18,"help_text":".gitignore","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".gitignore","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Performance optimization: Fix search timeouts","depth":16,"help_text":"Performance optimization: Fix search timeouts - Limited search to last 30 days instead of all meetings - Disabled transcript search by default (was causing 1.6MB+ responses) - Added logging for better debugging visibility - Updated tool descriptions to clarify limitations - Removed dangerous pagination loop that fetched all meetings Fixes timeout issues when searching for meetings with transcripts","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Performance optimization: Fix search timeouts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"LICENSE, (File)","depth":18,"help_text":"LICENSE","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"LICENSE","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"README.md, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.0,"width":0.026928192,"height":0.013567438},"help_text":"README.md","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"README.md","depth":19,"bounds":{"left":0.49268618,"top":0.0,"width":0.026928192,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"bounds":{"left":0.60388964,"top":0.0,"width":0.1015625,"height":0.013567438},"help_text":"Update README with GitHub integration status Add testing status note to confirm GitHub app integration is working correctly. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"bounds":{"left":0.60388964,"top":0.0,"width":0.1015625,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.0,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"claude-config-example.json, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.0,"width":0.06000665,"height":0.013567438},"help_text":"claude-config-example.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude-config-example.json","depth":19,"bounds":{"left":0.49268618,"top":0.0,"width":0.06000665,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"bounds":{"left":0.60388964,"top":0.0,"width":0.07795878,"height":0.013567438},"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"bounds":{"left":0.60388964,"top":0.0,"width":0.07795878,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.0,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package-lock.json, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.0,"width":0.039228722,"height":0.013567438},"help_text":"package-lock.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package-lock.json","depth":19,"bounds":{"left":0.49268618,"top":0.0,"width":0.039228722,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"bounds":{"left":0.60388964,"top":0.0,"width":0.07795878,"height":0.013567438},"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"bounds":{"left":0.60388964,"top":0.0,"width":0.07795878,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.0,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package.json, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.017956903,"width":0.02825798,"height":0.013567438},"help_text":"package.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package.json","depth":19,"bounds":{"left":0.49268618,"top":0.017956903,"width":0.02825798,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"bounds":{"left":0.60388964,"top":0.017956903,"width":0.07795878,"height":0.013567438},"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"bounds":{"left":0.60388964,"top":0.017956903,"width":0.07795878,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.017956903,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"tsconfig.json, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.050678372,"width":0.027593086,"height":0.013567438},"help_text":"tsconfig.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"tsconfig.json","depth":19,"bounds":{"left":0.49268618,"top":0.050678372,"width":0.027593086,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"bounds":{"left":0.60388964,"top":0.050678372,"width":0.07795878,"height":0.013567438},"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"bounds":{"left":0.60388964,"top":0.050678372,"width":0.07795878,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.050678372,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Name","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"src, (Directory)","depth":18,"help_text":"src","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"src","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".env.example, (File)","depth":18,"help_text":".env.example","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".env.example","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".gitignore, (File)","depth":18,"help_text":".gitignore","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".gitignore","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"LICENSE, (File)","depth":18,"help_text":"LICENSE","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"LICENSE","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"README.md, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.0,"width":0.026928192,"height":0.013567438},"help_text":"README.md","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"README.md","depth":19,"bounds":{"left":0.49268618,"top":0.0,"width":0.026928192,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"claude-config-example.json, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.0,"width":0.06000665,"height":0.013567438},"help_text":"claude-config-example.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude-config-example.json","depth":19,"bounds":{"left":0.49268618,"top":0.0,"width":0.06000665,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package-lock.json, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.0,"width":0.039228722,"height":0.013567438},"help_text":"package-lock.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package-lock.json","depth":19,"bounds":{"left":0.49268618,"top":0.0,"width":0.039228722,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package.json, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.017956903,"width":0.02825798,"height":0.013567438},"help_text":"package.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package.json","depth":19,"bounds":{"left":0.49268618,"top":0.017956903,"width":0.02825798,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"tsconfig.json, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.050678372,"width":0.027593086,"height":0.013567438},"help_text":"tsconfig.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"tsconfig.json","depth":19,"bounds":{"left":0.49268618,"top":0.050678372,"width":0.027593086,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit message","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":16,"help_text":"Fix Claude integration: Add stub handlers for resources and prompts - Added ListResourcesRequestSchema and ListPromptsRequestSchema handlers - Return empty arrays to prevent 'Method not found' errors - Updated server capabilities to include resources and prompts - Fixes Claude treating server as broken due to optional endpoint errors","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Performance optimization: Fix search timeouts","depth":16,"help_text":"Performance optimization: Fix search timeouts - Limited search to last 30 days instead of all meetings - Disabled transcript search by default (was causing 1.6MB+ responses) - Added logging for better debugging visibility - Updated tool descriptions to clarify limitations - Removed dangerous pagination loop that fetched all meetings Fixes timeout issues when searching for meetings with transcripts","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Performance optimization: Fix search timeouts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"bounds":{"left":0.60388964,"top":0.0,"width":0.1015625,"height":0.013567438},"help_text":"Update README with GitHub integration status Add testing status note to confirm GitHub app integration is working correctly. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"bounds":{"left":0.60388964,"top":0.0,"width":0.1015625,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"bounds":{"left":0.60388964,"top":0.0,"width":0.07795878,"height":0.013567438},"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"bounds":{"left":0.60388964,"top":0.0,"width":0.07795878,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"bounds":{"left":0.60388964,"top":0.0,"width":0.07795878,"height":0.013567438},"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"bounds":{"left":0.60388964,"top":0.0,"width":0.07795878,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"bounds":{"left":0.60388964,"top":0.017956903,"width":0.07795878,"height":0.013567438},"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"bounds":{"left":0.60388964,"top":0.017956903,"width":0.07795878,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"bounds":{"left":0.60388964,"top":0.050678372,"width":0.07795878,"height":0.013567438},"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"bounds":{"left":0.60388964,"top":0.050678372,"width":0.07795878,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit date","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.0,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.0,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.0,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.017956903,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.050678372,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Repository files navigation","depth":13,"bounds":{"left":0.47839096,"top":0.10614525,"width":0.0003324468,"height":0.0007980846},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Repository files navigation","depth":14,"bounds":{"left":0.47839096,"top":0.108938545,"width":0.095578454,"height":0.023144454},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"README","depth":16,"bounds":{"left":0.48138297,"top":0.09377494,"width":0.03274601,"height":0.026336791},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"README","depth":18,"bounds":{"left":0.49202126,"top":0.100159615,"width":0.019448139,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"MIT license","depth":16,"bounds":{"left":0.51678854,"top":0.09377494,"width":0.03873005,"height":0.026336791},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"MIT license","depth":18,"bounds":{"left":0.52792555,"top":0.100159615,"width":0.02443484,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Edit file","depth":13,"bounds":{"left":0.75265956,"top":0.09537111,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Outline","depth":13,"bounds":{"left":0.76462764,"top":0.09377494,"width":0.011303191,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"MCP Fathom Server","depth":14,"bounds":{"left":0.4893617,"top":0.15163608,"width":0.2785904,"height":0.04030327},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"MCP Fathom Server","depth":15,"bounds":{"left":0.4893617,"top":0.15243416,"width":0.095744684,"height":0.030327214},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: MCP Fathom Server","depth":14,"bounds":{"left":0.4800532,"top":0.15682362,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"An MCP (Model Context Protocol) server that integrates with Fathom AI's meeting API, enabling Claude to search and retrieve meeting information through natural language queries.","depth":15,"bounds":{"left":0.4893617,"top":0.20670392,"width":0.27293882,"height":0.03431764},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"MCP","depth":15,"bounds":{"left":0.4893617,"top":0.25937748,"width":0.03523936,"height":0.015163607},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Node.js","depth":15,"bounds":{"left":0.52609706,"top":0.25937748,"width":0.027925532,"height":0.015163607},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"TypeScript","depth":15,"bounds":{"left":0.5555186,"top":0.25937748,"width":0.03523936,"height":0.015163607},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"🎯 Features","depth":14,"bounds":{"left":0.4893617,"top":0.29569036,"width":0.2785904,"height":0.030726258},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🎯 Features","depth":15,"bounds":{"left":0.4893617,"top":0.29569036,"width":0.04138963,"height":0.025139665},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🎯 Features","depth":14,"bounds":{"left":0.4800532,"top":0.29608938,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"🔍 Smart Search","depth":17,"bounds":{"left":0.5,"top":0.34078214,"width":0.04105718,"height":0.016759777},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Natural language search across meeting titles, summaries, transcripts, and action items","depth":16,"bounds":{"left":0.54105717,"top":0.34118116,"width":0.21442819,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"📋 List Meetings","depth":17,"bounds":{"left":0.5,"top":0.36312848,"width":0.040724736,"height":0.016759777},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Retrieve meetings with various filters (attendees, date ranges, teams, etc.)","depth":16,"bounds":{"left":0.54072475,"top":0.36352754,"width":0.18267952,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"📝 Transcript Support","depth":17,"bounds":{"left":0.5,"top":0.38547486,"width":0.05435505,"height":0.016759777},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Optionally include full meeting transcripts in search results","depth":16,"bounds":{"left":0.554355,"top":0.3858739,"width":0.14444813,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"⚡ Real-time","depth":17,"bounds":{"left":0.5,"top":0.40782124,"width":0.031083776,"height":0.016759777},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Direct integration with Fathom's API for up-to-date meeting data","depth":16,"bounds":{"left":0.53108376,"top":0.40822026,"width":0.15890957,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🛡️ Secure","depth":17,"bounds":{"left":0.5,"top":0.4301676,"width":0.02443484,"height":0.016759777},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": API key management through environment variables","depth":16,"bounds":{"left":0.52443486,"top":0.43056664,"width":0.12865691,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🚀 Quick Start","depth":14,"bounds":{"left":0.4893617,"top":0.4668795,"width":0.2785904,"height":0.030327214},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🚀 Quick Start","depth":15,"bounds":{"left":0.4893617,"top":0.4668795,"width":0.050531916,"height":0.025139665},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🚀 Quick Start","depth":14,"bounds":{"left":0.4800532,"top":0.4668795,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Prerequisites","depth":14,"bounds":{"left":0.4893617,"top":0.51636076,"width":0.2785904,"height":0.019952115},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Prerequisites","depth":15,"bounds":{"left":0.4893617,"top":0.51675975,"width":0.040226065,"height":0.01915403},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: Prerequisites","depth":14,"bounds":{"left":0.4800532,"top":0.5151636,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Node.js 18 or higher","depth":16,"bounds":{"left":0.5,"top":0.5510774,"width":0.048537236,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"npm or yarn","depth":16,"bounds":{"left":0.5,"top":0.5734238,"width":0.029089095,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"A Fathom AI account with API access","depth":16,"bounds":{"left":0.5,"top":0.5957702,"width":0.08959442,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Claude Desktop app","depth":16,"bounds":{"left":0.5,"top":0.6181165,"width":0.049035903,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Installation","depth":14,"bounds":{"left":0.4893617,"top":0.6544294,"width":0.2785904,"height":0.019952115},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Installation","depth":15,"bounds":{"left":0.4893617,"top":0.6548284,"width":0.03357713,"height":0.01915403},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: Installation","depth":14,"bounds":{"left":0.4800532,"top":0.6532322,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Clone and setup","depth":17,"bounds":{"left":0.5,"top":0.68914604,"width":0.04089096,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"bounds":{"left":0.54089093,"top":0.68914604,"width":0.0014960107,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"git clone https://github.com/sourcegate/mcp-fathom-server.git","depth":16,"bounds":{"left":0.49468085,"top":0.7330407,"width":0.16589096,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"cd","depth":16,"bounds":{"left":0.49468085,"top":0.7490024,"width":0.005319149,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"mcp-fathom-server\nnpm install\nnpm run build","depth":16,"bounds":{"left":0.49468085,"top":0.7490024,"width":0.05435505,"height":0.044692736},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"bounds":{"left":0.75598407,"top":0.7254589,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Configure your API key","depth":17,"bounds":{"left":0.5,"top":0.8224262,"width":0.057679523,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"bounds":{"left":0.55767953,"top":0.8224262,"width":0.0014960107,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"cp .env.example .env","depth":16,"bounds":{"left":0.49468085,"top":0.86632085,"width":0.05435505,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":16,"bounds":{"left":0.49468085,"top":0.8818835,"width":0.0026595744,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Edit .env and add your Fathom API key","depth":16,"bounds":{"left":0.4973404,"top":0.8818835,"width":0.103390954,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"bounds":{"left":0.75598407,"top":0.858739,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Get your Fathom API key","depth":18,"bounds":{"left":0.5,"top":0.92418194,"width":0.06200133,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":17,"bounds":{"left":0.56200135,"top":0.92418194,"width":0.0014960107,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Log in to","depth":18,"bounds":{"left":0.5106383,"top":0.95610535,"width":0.02244016,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fathom","depth":18,"bounds":{"left":0.53307843,"top":0.95610535,"width":0.017952127,"height":0.015163607},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fathom","depth":19,"bounds":{"left":0.53307843,"top":0.95610535,"width":0.017952127,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Go to Settings → API","depth":18,"bounds":{"left":0.5106383,"top":0.9784517,"width":0.05036569,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Generate a new API key","depth":18,"bounds":{"left":0.5106383,"top":1.0,"width":0.057347074,"height":-0.0007981062},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Copy it to your","depth":18,"bounds":{"left":0.5106383,"top":1.0,"width":0.036901597,"height":-0.023144484},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".env","depth":19,"bounds":{"left":0.5493683,"top":1.0,"width":0.010970744,"height":-0.02513969},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"file","depth":18,"bounds":{"left":0.5621675,"top":1.0,"width":0.008643617,"height":-0.023144484},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Add to Claude Desktop","depth":18,"bounds":{"left":0.5,"top":1.0,"width":0.058011968,"height":-0.055067778},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":17,"bounds":{"left":0.55801195,"top":1.0,"width":0.0014960107,"height":-0.055067778},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Edit your Claude Desktop configuration file:","depth":15,"bounds":{"left":0.4893617,"top":1.0,"width":0.10488697,"height":-0.08699119},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"macOS","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"~/Library/Application Support/Claude/claude_desktop_config.json","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Windows","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"%APPDATA%\\Claude\\claude_desktop_config.json","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"{","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"mcpServers\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": {","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"fathom\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": {","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"command\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"node","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":",","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"args\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": [","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/absolute/path/to/mcp-fathom-server/dist/index.js","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"],","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"env\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": {","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"FATHOM_API_KEY\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"your-api-key-here","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"}\n }\n }\n}","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Restart Claude Desktop","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and you're ready to go! 🎉","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"💬 Usage Examples","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"💬 Usage Examples","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 💬 Usage Examples","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Once configured, you can ask Claude natural language questions about your meetings:","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"Find me meetings about recruiting\"\n\"Show me all external meetings from last week\" \n\"Search for meetings where we discussed product launches\"\n\"List meetings with john@example.com\"\n\"Find meetings with action items about hiring\"\n\"What did we discuss in our Q1 planning meetings?\"","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Claude will automatically choose the right tool and search method based on your query.","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🔧 Available Tools","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🔧 Available Tools","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🔧 Available Tools","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"list_meetings","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"list_meetings","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: list_meetings","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Retrieves meetings with optional filters:","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"calendar_invitees","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by attendee emails","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"calendar_invitees_domains","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by company domains","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"created_after","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"created_before","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Date range filters","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"meeting_type","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": all, internal, or external","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"include_transcript","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Include full transcripts","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"recorded_by","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by meeting owner","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"teams","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by team names","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"search_meetings","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"search_meetings","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: search_meetings","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Searches meetings by keywords:","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"search_term","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": The keyword/phrase to search for","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"include_transcript","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Search within transcripts (slower but more comprehensive)","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🛠️ Development","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🛠️ Development","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🛠️ Development","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"#","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Run in development mode","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"npm run dev","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Build for production","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"npm run build","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Test with MCP Inspector","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"npx @modelcontextprotocol/inspector dist/index.js","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"🐛 Troubleshooting","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🐛 Troubleshooting","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🐛 Troubleshooting","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Issue","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Solution","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Server won't start","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Check that your API key is correctly set","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"No results found","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Try broader search terms or check your API key permissions","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Rate limiting","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"The server handles this automatically - wait a moment and try again","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Claude can't find tools","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ensure Claude Desktop is restarted after config changes","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Issue","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Server won't start","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"No results found","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Rate limiting","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Claude can't find tools","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Solution","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Check that your API key is correctly set","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Try broader search terms or check your API key permissions","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"The server handles this automatically - wait a moment and try again","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ensure Claude Desktop is restarted after config changes","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"📄 License","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"📄 License","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 📄 License","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"MIT License - see","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"LICENSE","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"LICENSE","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"file for details.","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🤝 Contributing","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🤝 Contributing","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🤝 Contributing","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🙋♀️ Support","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🙋♀️ Support","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🙋♀️ Support","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"If you encounter any issues:","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Check the","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"troubleshooting section","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"troubleshooting section","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Search existing","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"GitHub issues","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"GitHub issues","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Create a new issue with detailed information about your problem","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Status","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Tested and working with GitHub integration ✓","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Built for fun by","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"@petesena","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"@petesena","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"❤️","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"About","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"About","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"No description, website, or topics provided.","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Resources","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Resources","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Readme","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Readme","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"License","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"License","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"MIT license","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"MIT license","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Activity","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Activity","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Stars","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Stars","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"8 stars","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"8","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"stars","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Watchers","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Watchers","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"0 watching","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"0","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"watching","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Forks","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Forks","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"4 forks","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"4","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"forks","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Report repository","depth":16,"bounds":{"left":0.7922208,"top":0.0,"width":0.037400264,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Report repository","depth":17,"bounds":{"left":0.7922208,"top":0.0,"width":0.037400264,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Releases","depth":15,"bounds":{"left":0.7922208,"top":0.0,"width":0.09042553,"height":0.01915403},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"Releases","depth":16,"bounds":{"left":0.7922208,"top":0.0,"width":0.02244016,"height":0.015163607},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Releases","depth":17,"bounds":{"left":0.7922208,"top":0.0,"width":0.02244016,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"No releases published","depth":16,"bounds":{"left":0.7922208,"top":0.0,"width":0.04155585,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Packages","depth":15,"bounds":{"left":0.7922208,"top":0.035913806,"width":0.09042553,"height":0.01915403},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"Packages","depth":16,"bounds":{"left":0.7922208,"top":0.035913806,"width":0.09042553,"height":0.01915403},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Packages","depth":17,"bounds":{"left":0.7922208,"top":0.03790902,"width":0.024102394,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"No packages published","depth":16,"bounds":{"left":0.7922208,"top":0.069034316,"width":0.043882977,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Contributors 2","depth":15,"bounds":{"left":0.7922208,"top":0.10853951,"width":0.09042553,"height":0.01915403},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"Contributors 2","depth":16,"bounds":{"left":0.7922208,"top":0.10853951,"width":0.09042553,"height":0.01915403},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Contributors","depth":17,"bounds":{"left":0.7922208,"top":0.11053472,"width":0.031914894,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":18,"bounds":{"left":0.8277925,"top":0.11213089,"width":0.002493351,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"@sourcegate","depth":17,"bounds":{"left":0.7922208,"top":0.14046289,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"sourcegate","depth":18,"bounds":{"left":0.8055186,"top":0.14644852,"width":0.025265958,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":20,"bounds":{"left":0.8055186,"top":0.14644852,"width":0.025265958,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"@claude","depth":17,"bounds":{"left":0.7922208,"top":0.17238627,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"claude Claude","depth":18,"bounds":{"left":0.8055186,"top":0.1783719,"width":0.03125,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":20,"bounds":{"left":0.8055186,"top":0.1783719,"width":0.014960106,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Claude","depth":19,"bounds":{"left":0.8216423,"top":0.1783719,"width":0.01512633,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Languages","depth":15,"bounds":{"left":0.7922208,"top":0.23064645,"width":0.09042553,"height":0.01915403},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Languages","depth":16,"bounds":{"left":0.7922208,"top":0.23264167,"width":0.027593086,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JavaScript 57.8%","depth":17,"bounds":{"left":0.7922208,"top":0.2753392,"width":0.041722074,"height":0.014365523},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JavaScript","depth":19,"bounds":{"left":0.80019945,"top":0.27653632,"width":0.020777926,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"57.8%","depth":19,"bounds":{"left":0.82230717,"top":0.27653632,"width":0.011635638,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"TypeScript 42.2%","depth":17,"bounds":{"left":0.7922208,"top":0.29289705,"width":0.042719416,"height":0.014365523},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"TypeScript","depth":19,"bounds":{"left":0.80019945,"top":0.29409418,"width":0.02144282,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"42.2%","depth":19,"bounds":{"left":0.82297206,"top":0.29409418,"width":0.011968086,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Footer","depth":7,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Footer","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"GitHub Homepage","depth":7,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"© 2026 GitHub, Inc.","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Footer navigation","depth":8,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Footer navigation","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Terms","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Terms","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Privacy","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Privacy","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Security","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Security","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Status","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false}]...
|
-6269029008030581898
|
-4913595457851463746
|
idle
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST [URL_WITH_CREDENTIALS] dist/index.js
Copy
🐛 Troubleshooting
🐛 Troubleshooting
Permalink: 🐛 Troubleshooting
Issue
Solution
Server won't start
Check that your API key is correctly set
No results found
Try broader search terms or check your API key permissions
Rate limiting
The server handles this automatically - wait a moment and try again
Claude can't find tools
Ensure Claude Desktop is restarted after config changes
Issue
Server won't start
No results found
Rate limiting
Claude can't find tools
Solution
Check that your API key is correctly set
Try broader search terms or check your API key permissions
The server handles this automatically - wait a moment and try again
Ensure Claude Desktop is restarted after config changes
📄 License
📄 License
Permalink: 📄 License
MIT License - see
LICENSE
LICENSE
file for details.
🤝 Contributing
🤝 Contributing
Permalink: 🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
🙋♀️ Support
🙋♀️ Support
Permalink: 🙋♀️ Support
If you encounter any issues:
Check the
troubleshooting section
troubleshooting section
Search existing
GitHub issues
GitHub issues
Create a new issue with detailed information about your problem
Status
: Tested and working with GitHub integration ✓
Built for fun by
@petesena
@petesena
❤️
About
About
No description, website, or topics provided.
Resources
Resources
Readme
Readme
License
License
MIT license
MIT license
Activity
Activity
Stars
Stars
8 stars
8
stars
Watchers
Watchers
0 watching
0
watching
Forks
Forks
4 forks
4
forks
Report repository
Report repository
Releases
Releases
Releases
No releases published
Packages
Packages
Packages
No packages published
Contributors 2
Contributors 2
Contributors
2
@sourcegate
sourcegate
sourcegate
@claude
claude Claude
claude
Claude
Languages
Languages
JavaScript 57.8%
JavaScript
57.8%
TypeScript 42.2%
TypeScript
42.2%
Footer
Footer
GitHub Homepage
© 2026 GitHub, Inc.
Footer navigation
Footer navigation
Terms
Terms
Privacy
Privacy
Security
Security
Status...
|
NULL
|
NULL
|
|
72379
|
1764
|
4
|
2026-04-22T15:41:02.798992+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-22/1776 /Users/lukas/.screenpipe/data/data/2026-04-22/1776872462798_m1.jpg...
|
Firefox
|
sourcegate/mcp-fathom-server — Work
|
1
|
github.com/sourcegate/mcp-fathom-server
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST [URL_WITH_CREDENTIALS] dist/index.js
Copy
🐛 Troubleshooting
🐛 Troubleshooting
Permalink: 🐛 Troubleshooting
Issue
Solution
Server won't start
Check that your API key is correctly set
No results found
Try broader search terms or check your API key permissions
Rate limiting
The server handles this automatically - wait a moment and try again
Claude can't find tools
Ensure Claude Desktop is restarted after config changes
Issue
Server won't start
No results found
Rate limiting
Claude can't find tools
Solution
Check that your API key is correctly set
Try broader search terms or check your API key permissions
The server handles this automatically - wait a moment and try again...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"SevenShores\\Hubspot\\Exceptions\\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SevenShores\\Hubspot\\Exceptions\\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20372] AI Reports > Empty page design and promotion - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20372] AI Reports > Empty page design and promotion - Jira","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny MCP Connector - Product - Confluence","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny MCP Connector - Product - Confluence","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Workers | Datadog","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Workers | Datadog","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pull requests · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20728] [HubSpot] Find the root cause of 429 hit and tweak API client rate limiter - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20728] [HubSpot] Find the root cause of 429 hit and tweak API client rate limiter - Jira","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"CloudWatch | us-east-2","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"CloudWatch | us-east-2","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Your 'Not enpough activities' report wasn't generated - lukas.kovalik@jiminny.com - Jiminny Mail","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Your 'Not enpough activities' report wasn't generated - lukas.kovalik@jiminny.com - Jiminny Mail","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny MCP Connector - Product - Confluence","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny MCP Connector - Product - Confluence","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"sourcegate/mcp-fathom-server","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"sourcegate/mcp-fathom-server","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"JY-9712 | change nudges schema by nikolaybiaivanov · Pull Request #11983 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-9712 | change nudges schema by nikolaybiaivanov · Pull Request #11983 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Architecture overview - Model Context Protocol","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Architecture overview - Model Context Protocol","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Laravel MCP - AI tooling for Laravel, by the Laravel team | Laravel - The clean stack for Artisans and agents","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Laravel MCP - AI tooling for Laravel, by the Laravel team | Laravel - The clean stack for Artisans and agents","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Laravel MCP | Laravel 13.x - The clean stack for Artisans and agents","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Laravel MCP | Laravel 13.x - The clean stack for Artisans and agents","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.028819444,"top":0.0,"width":0.022222223,"height":0.035555556},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.051736113,"top":0.0,"width":0.022222223,"height":0.035555556},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.075,"top":0.0,"width":0.022222223,"height":0.035555556},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.09826389,"top":0.0,"width":0.022222223,"height":0.035555556},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.121527776,"top":0.0,"width":0.022222223,"height":0.035555556},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Skip to content","depth":6,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to content","depth":7,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open menu","depth":10,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Homepage (g then d)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"sourcegate","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"mcp-fathom-server","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"mcp-fathom-server","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Search or jump to…","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Type","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"to search","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Chat with Copilot","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Open Copilot…","depth":9,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"Create new...","depth":9,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Issues","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Pull requests","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Repositories","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"You have unread notifications(g then n)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Open user navigation menu","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Repository navigation","depth":9,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Repository navigation","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Code","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Code","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Issues","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Issues","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Pull requests (2)","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Agents","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Agents","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Actions","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Actions","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Projects","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Projects","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Security and quality","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Security and quality","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Insights","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Insights","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Important update","depth":10,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Important update","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Review this update","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Review this update","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and manage your preferences in your","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"GitHub account settings","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"GitHub account settings","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Dismiss banner","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"mcp-fathom-server","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"mcp-fathom-server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Public","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Watch: Participating in sourcegate/mcp-fathom-server","depth":19,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Watch","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fork 4","depth":17,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fork","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"See your forks of this repository","depth":18,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Star this repository (8)","depth":18,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Star","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Add this repository to a list","depth":19,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"sourcegate/mcp-fathom-server","depth":13,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"sourcegate/mcp-fathom-server","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"main branch","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"main","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"1 Branch","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"1","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Branch","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"0 Tags","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"0","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Tags","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXComboBox","text":"Go to file","depth":13,"role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"Add file","depth":12,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Add file","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Add file","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Add file","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Code","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Code","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Folders and files","depth":12,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Folders and files","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Name","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit message","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit date","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"src, (Directory)","depth":18,"help_text":"src","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"src","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":16,"help_text":"Fix Claude integration: Add stub handlers for resources and prompts - Added ListResourcesRequestSchema and ListPromptsRequestSchema handlers - Return empty arrays to prevent 'Method not found' errors - Updated server capabilities to include resources and prompts - Fixes Claude treating server as broken due to optional endpoint errors","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".env.example, (File)","depth":18,"help_text":".env.example","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".env.example","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".gitignore, (File)","depth":18,"help_text":".gitignore","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".gitignore","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Performance optimization: Fix search timeouts","depth":16,"help_text":"Performance optimization: Fix search timeouts - Limited search to last 30 days instead of all meetings - Disabled transcript search by default (was causing 1.6MB+ responses) - Added logging for better debugging visibility - Updated tool descriptions to clarify limitations - Removed dangerous pagination loop that fetched all meetings Fixes timeout issues when searching for meetings with transcripts","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Performance optimization: Fix search timeouts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"LICENSE, (File)","depth":18,"help_text":"LICENSE","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"LICENSE","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"README.md, (File)","depth":18,"help_text":"README.md","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"README.md","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"Update README with GitHub integration status Add testing status note to confirm GitHub app integration is working correctly. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"claude-config-example.json, (File)","depth":18,"help_text":"claude-config-example.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude-config-example.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package-lock.json, (File)","depth":18,"help_text":"package-lock.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package-lock.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package.json, (File)","depth":18,"help_text":"package.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"tsconfig.json, (File)","depth":18,"help_text":"tsconfig.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"tsconfig.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Name","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"src, (Directory)","depth":18,"help_text":"src","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"src","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".env.example, (File)","depth":18,"help_text":".env.example","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".env.example","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".gitignore, (File)","depth":18,"help_text":".gitignore","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".gitignore","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"LICENSE, (File)","depth":18,"help_text":"LICENSE","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"LICENSE","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"README.md, (File)","depth":18,"help_text":"README.md","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"README.md","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"claude-config-example.json, (File)","depth":18,"help_text":"claude-config-example.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude-config-example.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package-lock.json, (File)","depth":18,"help_text":"package-lock.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package-lock.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package.json, (File)","depth":18,"help_text":"package.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"tsconfig.json, (File)","depth":18,"help_text":"tsconfig.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"tsconfig.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit message","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":16,"help_text":"Fix Claude integration: Add stub handlers for resources and prompts - Added ListResourcesRequestSchema and ListPromptsRequestSchema handlers - Return empty arrays to prevent 'Method not found' errors - Updated server capabilities to include resources and prompts - Fixes Claude treating server as broken due to optional endpoint errors","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Performance optimization: Fix search timeouts","depth":16,"help_text":"Performance optimization: Fix search timeouts - Limited search to last 30 days instead of all meetings - Disabled transcript search by default (was causing 1.6MB+ responses) - Added logging for better debugging visibility - Updated tool descriptions to clarify limitations - Removed dangerous pagination loop that fetched all meetings Fixes timeout issues when searching for meetings with transcripts","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Performance optimization: Fix search timeouts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"Update README with GitHub integration status Add testing status note to confirm GitHub app integration is working correctly. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit date","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Repository files navigation","depth":13,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Repository files navigation","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"README","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"README","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"MIT license","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"MIT license","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Edit file","depth":13,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Outline","depth":13,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"MCP Fathom Server","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"MCP Fathom Server","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: MCP Fathom Server","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"An MCP (Model Context Protocol) server that integrates with Fathom AI's meeting API, enabling Claude to search and retrieve meeting information through natural language queries.","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"MCP","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Node.js","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"TypeScript","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"🎯 Features","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🎯 Features","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🎯 Features","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"🔍 Smart Search","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Natural language search across meeting titles, summaries, transcripts, and action items","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"📋 List Meetings","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Retrieve meetings with various filters (attendees, date ranges, teams, etc.)","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"📝 Transcript Support","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Optionally include full meeting transcripts in search results","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"⚡ Real-time","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Direct integration with Fathom's API for up-to-date meeting data","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🛡️ Secure","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": API key management through environment variables","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🚀 Quick Start","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🚀 Quick Start","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🚀 Quick Start","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Prerequisites","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Prerequisites","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: Prerequisites","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Node.js 18 or higher","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"npm or yarn","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"A Fathom AI account with API access","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Claude Desktop app","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Installation","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Installation","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: Installation","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Clone and setup","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"git clone https://github.com/sourcegate/mcp-fathom-server.git","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"cd","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"mcp-fathom-server\nnpm install\nnpm run build","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Configure your API key","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"cp .env.example .env","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Edit .env and add your Fathom API key","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Get your Fathom API key","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Log in to","depth":18,"bounds":{"left":0.50208336,"top":0.0,"width":0.046875,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fathom","depth":18,"bounds":{"left":0.54895836,"top":0.0,"width":0.0375,"height":0.02111111},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fathom","depth":19,"bounds":{"left":0.54895836,"top":0.0,"width":0.0375,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Go to Settings → API","depth":18,"bounds":{"left":0.50208336,"top":0.0,"width":0.10520833,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Generate a new API key","depth":18,"bounds":{"left":0.50208336,"top":0.0011111111,"width":0.119791664,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Copy it to your","depth":18,"bounds":{"left":0.50208336,"top":0.032222223,"width":0.077083334,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".env","depth":19,"bounds":{"left":0.5829861,"top":0.035,"width":0.022916667,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"file","depth":18,"bounds":{"left":0.6097222,"top":0.032222223,"width":0.018055556,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Add to Claude Desktop","depth":18,"bounds":{"left":0.4798611,"top":0.07666667,"width":0.12118056,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":17,"bounds":{"left":0.6010417,"top":0.07666667,"width":0.003125,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Edit your Claude Desktop configuration file:","depth":15,"bounds":{"left":0.4576389,"top":0.12111111,"width":0.21909723,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"macOS","depth":17,"bounds":{"left":0.4798611,"top":0.16555555,"width":0.03784722,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"bounds":{"left":0.51770836,"top":0.16555555,"width":0.00625,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"~/Library/Application Support/Claude/claude_desktop_config.json","depth":17,"bounds":{"left":0.52743053,"top":0.16833334,"width":0.35833332,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Windows","depth":17,"bounds":{"left":0.4798611,"top":0.19666667,"width":0.047916666,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"bounds":{"left":0.5277778,"top":0.19666667,"width":0.00625,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"%APPDATA%\\Claude\\claude_desktop_config.json","depth":17,"bounds":{"left":0.5378472,"top":0.19944444,"width":0.24444444,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"{","depth":16,"bounds":{"left":0.46875,"top":0.25777778,"width":0.011111111,"height":0.04},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"mcpServers\"","depth":16,"bounds":{"left":0.4798611,"top":0.27944446,"width":0.068402775,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": {","depth":16,"bounds":{"left":0.46875,"top":0.27944446,"width":0.09652778,"height":0.040555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"fathom\"","depth":16,"bounds":{"left":0.49131945,"top":0.30166668,"width":0.04548611,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": {","depth":16,"bounds":{"left":0.46875,"top":0.30166668,"width":0.08506945,"height":0.04},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"command\"","depth":16,"bounds":{"left":0.50277776,"top":0.32333332,"width":0.051041666,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"bounds":{"left":0.5538194,"top":0.32333332,"width":0.011458334,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"bounds":{"left":0.56527776,"top":0.32333332,"width":0.0055555557,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"node","depth":16,"bounds":{"left":0.5708333,"top":0.32333332,"width":0.022916667,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"bounds":{"left":0.59375,"top":0.32333332,"width":0.0055555557,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":",","depth":16,"bounds":{"left":0.46875,"top":0.32333332,"width":0.13611111,"height":0.040555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"args\"","depth":16,"bounds":{"left":0.50277776,"top":0.34555554,"width":0.034027778,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": [","depth":16,"bounds":{"left":0.53680557,"top":0.34555554,"width":0.017013889,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"bounds":{"left":0.5538194,"top":0.34555554,"width":0.0055555557,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/absolute/path/to/mcp-fathom-server/dist/index.js","depth":16,"bounds":{"left":0.559375,"top":0.34555554,"width":0.27847221,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"bounds":{"left":0.83784723,"top":0.34555554,"width":0.005902778,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"],","depth":16,"bounds":{"left":0.46875,"top":0.34555554,"width":0.3861111,"height":0.04},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"env\"","depth":16,"bounds":{"left":0.50277776,"top":0.36722222,"width":0.028472222,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": {","depth":16,"bounds":{"left":0.46875,"top":0.36722222,"width":0.07951389,"height":0.04},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"FATHOM_API_KEY\"","depth":16,"bounds":{"left":0.5138889,"top":0.3888889,"width":0.09097222,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"bounds":{"left":0.60486114,"top":0.3888889,"width":0.011458334,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"bounds":{"left":0.6163194,"top":0.3888889,"width":0.0055555557,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"your-api-key-here","depth":16,"bounds":{"left":0.621875,"top":0.3888889,"width":0.096875,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"bounds":{"left":0.71875,"top":0.3888889,"width":0.0055555557,"height":0.018333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"}\n }\n }\n}","depth":16,"bounds":{"left":0.46875,"top":0.41111112,"width":0.039583333,"height":0.08388889},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"bounds":{"left":1.0,"top":0.24722221,"width":-0.014583349,"height":0.031111112},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Restart Claude Desktop","depth":17,"bounds":{"left":0.4798611,"top":0.535,"width":0.125,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and you're ready to go! 🎉","depth":16,"bounds":{"left":0.60486114,"top":0.53444445,"width":0.134375,"height":0.023333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"💬 Usage Examples","depth":14,"bounds":{"left":0.4576389,"top":0.58555555,"width":0.54236114,"height":0.042777777},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"💬 Usage Examples","depth":15,"bounds":{"left":0.4576389,"top":0.58555555,"width":0.14548612,"height":0.035},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 💬 Usage Examples","depth":14,"bounds":{"left":0.43819445,"top":0.5861111,"width":0.019444445,"height":0.031111112},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Once configured, you can ask Claude natural language questions about your meetings:","depth":15,"bounds":{"left":0.4576389,"top":0.6488889,"width":0.43784723,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"Find me meetings about recruiting\"\n\"Show me all external meetings from last week\" \n\"Search for meetings where we discussed product launches\"\n\"List meetings with john@example.com\"\n\"Find meetings with action items about hiring\"\n\"What did we discuss in our Q1 planning meetings?\"","depth":17,"bounds":{"left":0.46875,"top":0.71,"width":0.3236111,"height":0.12777779},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"bounds":{"left":1.0,"top":0.6994445,"width":-0.014583349,"height":0.031111112},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Claude will automatically choose the right tool and search method based on your query.","depth":15,"bounds":{"left":0.4576389,"top":0.87777776,"width":0.4420139,"height":0.02111111},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🔧 Available Tools","depth":14,"bounds":{"left":0.4576389,"top":0.92833334,"width":0.54236114,"height":0.042777777},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🔧 Available Tools","depth":15,"bounds":{"left":0.4576389,"top":0.92833334,"width":0.13229166,"height":0.035},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🔧 Available Tools","depth":14,"bounds":{"left":0.43819445,"top":0.9288889,"width":0.019444445,"height":0.031111112},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"list_meetings","depth":14,"bounds":{"left":0.4576389,"top":0.99777776,"width":0.54236114,"height":0.00222224},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"list_meetings","depth":16,"bounds":{"left":0.46041667,"top":0.9988889,"width":0.108333334,"height":0.0011110902},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: list_meetings","depth":14,"bounds":{"left":0.43819445,"top":0.9961111,"width":0.019444445,"height":0.003888905},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Retrieves meetings with optional filters:","depth":15,"bounds":{"left":0.4576389,"top":1.0,"width":0.19826388,"height":-0.046666622},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"calendar_invitees","depth":17,"bounds":{"left":0.48333332,"top":1.0,"width":0.096875,"height":-0.09388888},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by attendee emails","depth":16,"bounds":{"left":0.58368057,"top":1.0,"width":0.12986112,"height":-0.091111064},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"calendar_invitees_domains","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by company domains","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"created_after","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"created_before","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Date range filters","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"meeting_type","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": all, internal, or external","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"include_transcript","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Include full transcripts","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"recorded_by","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by meeting owner","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"teams","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by team names","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"search_meetings","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"search_meetings","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: search_meetings","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Searches meetings by keywords:","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"search_term","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": The keyword/phrase to search for","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"include_transcript","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Search within transcripts (slower but more comprehensive)","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🛠️ Development","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🛠️ Development","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🛠️ Development","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"#","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Run in development mode","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"npm run dev","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Build for production","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"npm run build","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Test with MCP Inspector","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"npx @modelcontextprotocol/inspector dist/index.js","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"🐛 Troubleshooting","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🐛 Troubleshooting","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🐛 Troubleshooting","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Issue","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Solution","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Server won't start","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Check that your API key is correctly set","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"No results found","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Try broader search terms or check your API key permissions","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Rate limiting","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"The server handles this automatically - wait a moment and try again","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Claude can't find tools","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ensure Claude Desktop is restarted after config changes","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Issue","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Server won't start","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"No results found","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Rate limiting","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Claude can't find tools","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Solution","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Check that your API key is correctly set","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Try broader search terms or check your API key permissions","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"The server handles this automatically - wait a moment and try again","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
2864153419520322471
|
-4913595466441398594
|
idle
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST [URL_WITH_CREDENTIALS] dist/index.js
Copy
🐛 Troubleshooting
🐛 Troubleshooting
Permalink: 🐛 Troubleshooting
Issue
Solution
Server won't start
Check that your API key is correctly set
No results found
Try broader search terms or check your API key permissions
Rate limiting
The server handles this automatically - wait a moment and try again
Claude can't find tools
Ensure Claude Desktop is restarted after config changes
Issue
Server won't start
No results found
Rate limiting
Claude can't find tools
Solution
Check that your API key is correctly set
Try broader search terms or check your API key permissions
The server handles this automatically - wait a moment and try again...
|
72377
|
NULL
|
|
72380
|
1765
|
7
|
2026-04-22T15:41:04.750182+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-22/1776 /Users/lukas/.screenpipe/data/data/2026-04-22/1776872464750_m2.jpg...
|
Firefox
|
sourcegate/mcp-fathom-server — Work
|
1
|
github.com/sourcegate/mcp-fathom-server
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {"status":"error","message":"You have reached your secondly limit.","errorType":"RATE_LIMIT
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {"status":"error","message":"You have reached your secondly limit.","errorType":"RATE_LIMIT
[JY-20372] AI Reports > Empty page design and promotion - Jira
[JY-20372] AI Reports > Empty page design and promotion - Jira
Jiminny MCP Connector - Product - Confluence
Jiminny MCP Connector - Product - Confluence
Jiminny
Jiminny
Workers | Datadog
Workers | Datadog
Pull requests · jiminny/app
Pull requests · jiminny/app
[JY-20728] [HubSpot] Find the root cause of 429 hit and tweak API client rate limiter - Jira
[JY-20728] [HubSpot] Find the root cause of 429 hit and tweak API client rate limiter - Jira
JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app
JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app
Jiminny
Jiminny
CloudWatch | us-east-2
CloudWatch | us-east-2
Your 'Not enpough activities' report wasn't generated - [EMAIL] - Jiminny Mail
Your 'Not enpough activities' report wasn't generated - [EMAIL] - Jiminny Mail
Jiminny MCP Connector - Product - Confluence
Jiminny MCP Connector - Product - Confluence
sourcegate/mcp-fathom-server
sourcegate/mcp-fathom-server
Close tab
JY-9712 | change nudges schema by nikolaybiaivanov · Pull Request #11983 · jiminny/app
JY-9712 | change nudges schema by nikolaybiaivanov · Pull Request #11983 · jiminny/app
JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app
JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app
Architecture overview - Model Context Protocol
Architecture overview - Model Context Protocol
Laravel MCP - AI tooling for Laravel, by the Laravel team | Laravel - The clean stack for Artisans and agents
Laravel MCP - AI tooling for Laravel, by the Laravel team | Laravel - The clean stack for Artisans and agents
Laravel MCP | Laravel 13.x - The clean stack for Artisans and agents
Laravel MCP | Laravel 13.x - The clean stack for Artisans and agents
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Skip to content
Skip to content
Open menu
Homepage (g then d)
sourcegate
sourcegate
mcp-fathom-server
mcp-fathom-server
Search or jump to…
Type
/
to search
Chat with Copilot
Open Copilot…
Create new...
Issues
Pull requests
Repositories
You have unread notifications(g then n)
Open user navigation menu
Repository navigation
Repository navigation
Code
Code
Issues
Issues
Pull requests (2)
Pull requests
(
2
)
Agents
Agents
Actions
Actions
Projects
Projects
Security and quality
Security and quality
Insights
Insights
Important update
Important update
On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.
Review this update
Review this update
and manage your preferences in your
GitHub account settings
GitHub account settings
.
Dismiss banner
mcp-fathom-server
mcp-fathom-server
Public
Watch: Participating in sourcegate/mcp-fathom-server
Watch
(
0
)
Fork 4
Fork
4
See your forks of this repository
Star this repository (8)
Star
8
Add this repository to a list
sourcegate/mcp-fathom-server
sourcegate/mcp-fathom-server
main branch
main
1 Branch
1
Branch
0 Tags
0
Tags
Go to file
Add file
Add file
Add file
Add file
Code
Code
Folders and files
Folders and files
Name
Last commit message
Last commit date
Latest commit
Latest commit
commits by sourcegate
sourcegate
and
commits by claude
claude
Update README with GitHub integration status
Update README with GitHub integration status
Open commit details
Commit f36377c
f36377c
·
4 months ago
History
History
6 Commits
6 Commits
src, (Directory)
src
Fix Claude integration: Add stub handlers for resources and prompts
Fix Claude integration: Add stub handlers for resources and prompts
8 months ago
.env.example, (File)
.env.example
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
8 months ago
.gitignore, (File)
.gitignore
Performance optimization: Fix search timeouts
Performance optimization: Fix search timeouts
8 months ago
LICENSE, (File)
LICENSE
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
8 months ago
README.md, (File)
README.md
Update README with GitHub integration status
Update README with GitHub integration status
4 months ago
claude-config-example.json, (File)
claude-config-example.json
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
8 months ago
package-lock.json, (File)
package-lock.json
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
8 months ago
package.json, (File)
package.json
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
8 months ago
tsconfig.json, (File)
tsconfig.json
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
8 months ago
Name
Latest commit
Latest commit
commits by sourcegate
sourcegate
and
commits by claude
claude
Update README with GitHub integration status
Update README with GitHub integration status
Open commit details
Commit f36377c
f36377c
·
4 months ago
History
History
6 Commits
6 Commits
src, (Directory)
src
.env.example, (File)
.env.example
.gitignore, (File)
.gitignore
LICENSE, (File)
LICENSE
README.md, (File)
README.md
claude-config-example.json, (File)
claude-config-example.json
package-lock.json, (File)
package-lock.json
package.json, (File)
package.json
tsconfig.json, (File)
tsconfig.json
Last commit message
Latest commit
Latest commit
commits by sourcegate
sourcegate
and
commits by claude
claude
Update README with GitHub integration status
Update README with GitHub integration status
Open commit details
Commit f36377c
f36377c
·
4 months ago
History
History
6 Commits
6 Commits
Fix Claude integration: Add stub handlers for resources and prompts
Fix Claude integration: Add stub handlers for resources and prompts
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
Performance optimization: Fix search timeouts
Performance optimization: Fix search timeouts
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
Update README with GitHub integration status
Update README with GitHub integration status
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
Last commit date
Latest commit
Latest commit
commits by sourcegate
sourcegate
and
commits by claude
claude
Update README with GitHub integration status
Update README with GitHub integration status
Open commit details
Commit f36377c
f36377c
·
4 months ago
History
History
6 Commits
6 Commits
8 months ago
8 months ago
8 months ago
8 months ago
4 months ago
8 months ago
8 months ago
8 months ago
8 months ago
Repository files navigation
Repository files navigation
README
README
MIT license
MIT license
Edit file
Outline
MCP Fathom Server
MCP Fathom Server
Permalink: MCP Fathom Server
An MCP (Model Context Protocol) server that integrates with Fathom AI's meeting API, enabling Claude to search and retrieve meeting information through natural language queries.
MCP
Node.js
TypeScript
🎯 Features
🎯 Features
Permalink: 🎯 Features
🔍 Smart Search
: Natural language search across meeting titles, summaries, transcripts, and action items
📋 List Meetings
: Retrieve meetings with various filters (attendees, date ranges, teams, etc.)
📝 Transcript Support
: Optionally include full meeting transcripts in search results
⚡ Real-time
: Direct integration with Fathom's API for up-to-date meeting data
🛡️ Secure
: API key management through environment variables
🚀 Quick Start
🚀 Quick Start
Permalink: 🚀 Quick Start
Prerequisites
Prerequisites
Permalink: Prerequisites
Node.js 18 or higher
npm or yarn
A Fathom AI account with API access
Claude Desktop app
Installation
Installation
Permalink: Installation
Clone and setup
:
git clone https://github.com/sourcegate/mcp-fathom-server.git
cd
mcp-fathom-server
npm install
npm run build
Copy
Configure your API key
:
cp .env.example .env
#
Edit .env and add your Fathom API key
Copy
Get your Fathom API key
:
Log in to
Fathom
Fathom
Go to Settings → API
Generate a new API key
Copy it to your
.env
file
Add to Claude Desktop
:
Edit your Claude Desktop configuration file:
macOS
:
~/Library/Application Support/Claude/claude_desktop_config.json
Windows
:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers"
: {
"fathom"
: {
"command"
:
"
node
"
,
"args"
: [
"
/absolute/path/to/mcp-fathom-server/dist/index.js
"
],
"env"
: {
"FATHOM_API_KEY"
:
"
your-api-key-here
"
}
}
}
}
Copy
Restart Claude Desktop
and you're ready to go! 🎉
💬 Usage Examples
💬 Usage Examples
Permalink: 💬 Usage Examples
Once configured, you can ask Claude natural language questions about your meetings:
"Find me meetings about recruiting"
"Show me all external meetings from last week"
"Search for meetings where we discussed product launches"
"List meetings with [EMAIL]"
"Find meetings with action items about hiring"
"What did we discuss in our Q1 planning meetings?"
Copy
Claude will automatically choose the right tool and search method based on your query.
🔧 Available Tools
🔧 Available Tools
Permalink: 🔧 Available Tools
list_meetings
list_meetings
Permalink: list_meetings
Retrieves meetings with optional filters:
calendar_invitees
: Filter by attendee emails
calendar_invitees_domains
: Filter by company domains
created_after
/
created_before
: Date range filters
meeting_type
: all, internal, or external
include_transcript
: Include full transcripts
recorded_by
: Filter by meeting owner...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"bounds":{"left":0.28307846,"top":0.0518755,"width":0.07596409,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"SevenShores\\Hubspot\\Exceptions\\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT","depth":4,"bounds":{"left":0.28125,"top":0.09497207,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SevenShores\\Hubspot\\Exceptions\\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT","depth":5,"bounds":{"left":0.2945479,"top":0.10614525,"width":0.4644282,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20372] AI Reports > Empty page design and promotion - Jira","depth":4,"bounds":{"left":0.28125,"top":0.12769353,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20372] AI Reports > Empty page design and promotion - Jira","depth":5,"bounds":{"left":0.2945479,"top":0.13886672,"width":0.11319814,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny MCP Connector - Product - Confluence","depth":4,"bounds":{"left":0.28125,"top":0.16041501,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny MCP Connector - Product - Confluence","depth":5,"bounds":{"left":0.2945479,"top":0.17158818,"width":0.08294548,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.28125,"top":0.19313647,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"bounds":{"left":0.2945479,"top":0.20430966,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Workers | Datadog","depth":4,"bounds":{"left":0.28125,"top":0.22585794,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Workers | Datadog","depth":5,"bounds":{"left":0.2945479,"top":0.23703113,"width":0.032081116,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pull requests · jiminny/app","depth":4,"bounds":{"left":0.28125,"top":0.2585794,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests · jiminny/app","depth":5,"bounds":{"left":0.2945479,"top":0.2697526,"width":0.04537899,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20728] [HubSpot] Find the root cause of 429 hit and tweak API client rate limiter - Jira","depth":4,"bounds":{"left":0.28125,"top":0.29130086,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20728] [HubSpot] Find the root cause of 429 hit and tweak API client rate limiter - Jira","depth":5,"bounds":{"left":0.2945479,"top":0.30247405,"width":0.15791224,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":4,"bounds":{"left":0.28125,"top":0.32402235,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":5,"bounds":{"left":0.2945479,"top":0.33519554,"width":0.16555852,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.28125,"top":0.3567438,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"bounds":{"left":0.2945479,"top":0.367917,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"CloudWatch | us-east-2","depth":4,"bounds":{"left":0.28125,"top":0.38946527,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"CloudWatch | us-east-2","depth":5,"bounds":{"left":0.2945479,"top":0.40063846,"width":0.041223403,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Your 'Not enpough activities' report wasn't generated - lukas.kovalik@jiminny.com - Jiminny Mail","depth":4,"bounds":{"left":0.28125,"top":0.42218676,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Your 'Not enpough activities' report wasn't generated - lukas.kovalik@jiminny.com - Jiminny Mail","depth":5,"bounds":{"left":0.2945479,"top":0.43335995,"width":0.16821809,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny MCP Connector - Product - Confluence","depth":4,"bounds":{"left":0.28125,"top":0.45490822,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny MCP Connector - Product - Confluence","depth":5,"bounds":{"left":0.2945479,"top":0.4660814,"width":0.08294548,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"sourcegate/mcp-fathom-server","depth":4,"bounds":{"left":0.28125,"top":0.48762968,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"sourcegate/mcp-fathom-server","depth":5,"bounds":{"left":0.2945479,"top":0.49880287,"width":0.0546875,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.34857047,"top":0.49481246,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"JY-9712 | change nudges schema by nikolaybiaivanov · Pull Request #11983 · jiminny/app","depth":4,"bounds":{"left":0.28125,"top":0.5203512,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-9712 | change nudges schema by nikolaybiaivanov · Pull Request #11983 · jiminny/app","depth":5,"bounds":{"left":0.2945479,"top":0.53152436,"width":0.15475398,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":4,"bounds":{"left":0.28125,"top":0.55307263,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":5,"bounds":{"left":0.2945479,"top":0.5642458,"width":0.16555852,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Architecture overview - Model Context Protocol","depth":4,"bounds":{"left":0.28125,"top":0.5857941,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Architecture overview - Model Context Protocol","depth":5,"bounds":{"left":0.2945479,"top":0.5969673,"width":0.08277926,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Laravel MCP - AI tooling for Laravel, by the Laravel team | Laravel - The clean stack for Artisans and agents","depth":4,"bounds":{"left":0.28125,"top":0.61851555,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Laravel MCP - AI tooling for Laravel, by the Laravel team | Laravel - The clean stack for Artisans and agents","depth":5,"bounds":{"left":0.2945479,"top":0.62968874,"width":0.18583776,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Laravel MCP | Laravel 13.x - The clean stack for Artisans and agents","depth":4,"bounds":{"left":0.28125,"top":0.651237,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Laravel MCP | Laravel 13.x - The clean stack for Artisans and agents","depth":5,"bounds":{"left":0.2945479,"top":0.6624102,"width":0.1178524,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.2840758,"top":0.6855547,"width":0.07413564,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.2840758,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.29504654,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.30618352,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.31732047,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.32845744,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Skip to content","depth":6,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to content","depth":7,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open menu","depth":10,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Homepage (g then d)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"sourcegate","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"mcp-fathom-server","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"mcp-fathom-server","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Search or jump to…","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Type","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"to search","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Chat with Copilot","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Open Copilot…","depth":9,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"Create new...","depth":9,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Issues","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Pull requests","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Repositories","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"You have unread notifications(g then n)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Open user navigation menu","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Repository navigation","depth":9,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Repository navigation","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Code","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Code","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Issues","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Issues","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Pull requests (2)","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Agents","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Agents","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Actions","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Actions","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Projects","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Projects","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Security and quality","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Security and quality","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Insights","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Insights","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Important update","depth":10,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Important update","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Review this update","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Review this update","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and manage your preferences in your","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"GitHub account settings","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"GitHub account settings","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Dismiss banner","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"mcp-fathom-server","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"mcp-fathom-server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Public","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Watch: Participating in sourcegate/mcp-fathom-server","depth":19,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Watch","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fork 4","depth":17,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fork","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"See your forks of this repository","depth":18,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Star this repository (8)","depth":18,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Star","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Add this repository to a list","depth":19,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"sourcegate/mcp-fathom-server","depth":13,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"sourcegate/mcp-fathom-server","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"main branch","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"main","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"1 Branch","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"1","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Branch","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"0 Tags","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"0","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Tags","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXComboBox","text":"Go to file","depth":13,"role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"Add file","depth":12,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Add file","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Add file","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Add file","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Code","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Code","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Folders and files","depth":12,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Folders and files","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Name","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit message","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit date","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"src, (Directory)","depth":18,"help_text":"src","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"src","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":16,"help_text":"Fix Claude integration: Add stub handlers for resources and prompts - Added ListResourcesRequestSchema and ListPromptsRequestSchema handlers - Return empty arrays to prevent 'Method not found' errors - Updated server capabilities to include resources and prompts - Fixes Claude treating server as broken due to optional endpoint errors","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".env.example, (File)","depth":18,"help_text":".env.example","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".env.example","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".gitignore, (File)","depth":18,"help_text":".gitignore","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".gitignore","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Performance optimization: Fix search timeouts","depth":16,"help_text":"Performance optimization: Fix search timeouts - Limited search to last 30 days instead of all meetings - Disabled transcript search by default (was causing 1.6MB+ responses) - Added logging for better debugging visibility - Updated tool descriptions to clarify limitations - Removed dangerous pagination loop that fetched all meetings Fixes timeout issues when searching for meetings with transcripts","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Performance optimization: Fix search timeouts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"LICENSE, (File)","depth":18,"help_text":"LICENSE","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"LICENSE","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"README.md, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.0,"width":0.026928192,"height":0.013567438},"help_text":"README.md","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"README.md","depth":19,"bounds":{"left":0.49268618,"top":0.0,"width":0.026928192,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"bounds":{"left":0.60388964,"top":0.0,"width":0.1015625,"height":0.013567438},"help_text":"Update README with GitHub integration status Add testing status note to confirm GitHub app integration is working correctly. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"bounds":{"left":0.60388964,"top":0.0,"width":0.1015625,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.0,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"claude-config-example.json, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.0,"width":0.06000665,"height":0.013567438},"help_text":"claude-config-example.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude-config-example.json","depth":19,"bounds":{"left":0.49268618,"top":0.0,"width":0.06000665,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"bounds":{"left":0.60388964,"top":0.0,"width":0.07795878,"height":0.013567438},"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"bounds":{"left":0.60388964,"top":0.0,"width":0.07795878,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.0,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package-lock.json, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.0,"width":0.039228722,"height":0.013567438},"help_text":"package-lock.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package-lock.json","depth":19,"bounds":{"left":0.49268618,"top":0.0,"width":0.039228722,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"bounds":{"left":0.60388964,"top":0.0,"width":0.07795878,"height":0.013567438},"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"bounds":{"left":0.60388964,"top":0.0,"width":0.07795878,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.0,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package.json, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.017956903,"width":0.02825798,"height":0.013567438},"help_text":"package.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package.json","depth":19,"bounds":{"left":0.49268618,"top":0.017956903,"width":0.02825798,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"bounds":{"left":0.60388964,"top":0.017956903,"width":0.07795878,"height":0.013567438},"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"bounds":{"left":0.60388964,"top":0.017956903,"width":0.07795878,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.017956903,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"tsconfig.json, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.050678372,"width":0.027593086,"height":0.013567438},"help_text":"tsconfig.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"tsconfig.json","depth":19,"bounds":{"left":0.49268618,"top":0.050678372,"width":0.027593086,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"bounds":{"left":0.60388964,"top":0.050678372,"width":0.07795878,"height":0.013567438},"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"bounds":{"left":0.60388964,"top":0.050678372,"width":0.07795878,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.050678372,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Name","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"src, (Directory)","depth":18,"help_text":"src","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"src","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".env.example, (File)","depth":18,"help_text":".env.example","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".env.example","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".gitignore, (File)","depth":18,"help_text":".gitignore","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".gitignore","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"LICENSE, (File)","depth":18,"help_text":"LICENSE","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"LICENSE","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"README.md, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.0,"width":0.026928192,"height":0.013567438},"help_text":"README.md","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"README.md","depth":19,"bounds":{"left":0.49268618,"top":0.0,"width":0.026928192,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"claude-config-example.json, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.0,"width":0.06000665,"height":0.013567438},"help_text":"claude-config-example.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude-config-example.json","depth":19,"bounds":{"left":0.49268618,"top":0.0,"width":0.06000665,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package-lock.json, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.0,"width":0.039228722,"height":0.013567438},"help_text":"package-lock.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package-lock.json","depth":19,"bounds":{"left":0.49268618,"top":0.0,"width":0.039228722,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package.json, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.017956903,"width":0.02825798,"height":0.013567438},"help_text":"package.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package.json","depth":19,"bounds":{"left":0.49268618,"top":0.017956903,"width":0.02825798,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"tsconfig.json, (File)","depth":18,"bounds":{"left":0.49268618,"top":0.050678372,"width":0.027593086,"height":0.013567438},"help_text":"tsconfig.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"tsconfig.json","depth":19,"bounds":{"left":0.49268618,"top":0.050678372,"width":0.027593086,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit message","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":16,"help_text":"Fix Claude integration: Add stub handlers for resources and prompts - Added ListResourcesRequestSchema and ListPromptsRequestSchema handlers - Return empty arrays to prevent 'Method not found' errors - Updated server capabilities to include resources and prompts - Fixes Claude treating server as broken due to optional endpoint errors","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Performance optimization: Fix search timeouts","depth":16,"help_text":"Performance optimization: Fix search timeouts - Limited search to last 30 days instead of all meetings - Disabled transcript search by default (was causing 1.6MB+ responses) - Added logging for better debugging visibility - Updated tool descriptions to clarify limitations - Removed dangerous pagination loop that fetched all meetings Fixes timeout issues when searching for meetings with transcripts","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Performance optimization: Fix search timeouts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"bounds":{"left":0.60388964,"top":0.0,"width":0.1015625,"height":0.013567438},"help_text":"Update README with GitHub integration status Add testing status note to confirm GitHub app integration is working correctly. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"bounds":{"left":0.60388964,"top":0.0,"width":0.1015625,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"bounds":{"left":0.60388964,"top":0.0,"width":0.07795878,"height":0.013567438},"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"bounds":{"left":0.60388964,"top":0.0,"width":0.07795878,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"bounds":{"left":0.60388964,"top":0.0,"width":0.07795878,"height":0.013567438},"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"bounds":{"left":0.60388964,"top":0.0,"width":0.07795878,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"bounds":{"left":0.60388964,"top":0.017956903,"width":0.07795878,"height":0.013567438},"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"bounds":{"left":0.60388964,"top":0.017956903,"width":0.07795878,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"bounds":{"left":0.60388964,"top":0.050678372,"width":0.07795878,"height":0.013567438},"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"bounds":{"left":0.60388964,"top":0.050678372,"width":0.07795878,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit date","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.0,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.0,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.0,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.017956903,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"bounds":{"left":0.7435173,"top":0.050678372,"width":0.029753989,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Repository files navigation","depth":13,"bounds":{"left":0.47839096,"top":0.10614525,"width":0.0003324468,"height":0.0007980846},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Repository files navigation","depth":14,"bounds":{"left":0.47839096,"top":0.108938545,"width":0.095578454,"height":0.023144454},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"README","depth":16,"bounds":{"left":0.48138297,"top":0.09377494,"width":0.03274601,"height":0.026336791},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"README","depth":18,"bounds":{"left":0.49202126,"top":0.100159615,"width":0.019448139,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"MIT license","depth":16,"bounds":{"left":0.51678854,"top":0.09377494,"width":0.03873005,"height":0.026336791},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"MIT license","depth":18,"bounds":{"left":0.52792555,"top":0.100159615,"width":0.02443484,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Edit file","depth":13,"bounds":{"left":0.75265956,"top":0.09537111,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Outline","depth":13,"bounds":{"left":0.76462764,"top":0.09377494,"width":0.011303191,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"MCP Fathom Server","depth":14,"bounds":{"left":0.4893617,"top":0.15163608,"width":0.2785904,"height":0.04030327},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"MCP Fathom Server","depth":15,"bounds":{"left":0.4893617,"top":0.15243416,"width":0.095744684,"height":0.030327214},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: MCP Fathom Server","depth":14,"bounds":{"left":0.4800532,"top":0.15682362,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"An MCP (Model Context Protocol) server that integrates with Fathom AI's meeting API, enabling Claude to search and retrieve meeting information through natural language queries.","depth":15,"bounds":{"left":0.4893617,"top":0.20670392,"width":0.27293882,"height":0.03431764},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"MCP","depth":15,"bounds":{"left":0.4893617,"top":0.25937748,"width":0.03523936,"height":0.015163607},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Node.js","depth":15,"bounds":{"left":0.52609706,"top":0.25937748,"width":0.027925532,"height":0.015163607},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"TypeScript","depth":15,"bounds":{"left":0.5555186,"top":0.25937748,"width":0.03523936,"height":0.015163607},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"🎯 Features","depth":14,"bounds":{"left":0.4893617,"top":0.29569036,"width":0.2785904,"height":0.030726258},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🎯 Features","depth":15,"bounds":{"left":0.4893617,"top":0.29569036,"width":0.04138963,"height":0.025139665},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🎯 Features","depth":14,"bounds":{"left":0.4800532,"top":0.29608938,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"🔍 Smart Search","depth":17,"bounds":{"left":0.5,"top":0.34078214,"width":0.04105718,"height":0.016759777},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Natural language search across meeting titles, summaries, transcripts, and action items","depth":16,"bounds":{"left":0.54105717,"top":0.34118116,"width":0.21442819,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"📋 List Meetings","depth":17,"bounds":{"left":0.5,"top":0.36312848,"width":0.040724736,"height":0.016759777},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Retrieve meetings with various filters (attendees, date ranges, teams, etc.)","depth":16,"bounds":{"left":0.54072475,"top":0.36352754,"width":0.18267952,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"📝 Transcript Support","depth":17,"bounds":{"left":0.5,"top":0.38547486,"width":0.05435505,"height":0.016759777},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Optionally include full meeting transcripts in search results","depth":16,"bounds":{"left":0.554355,"top":0.3858739,"width":0.14444813,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"⚡ Real-time","depth":17,"bounds":{"left":0.5,"top":0.40782124,"width":0.031083776,"height":0.016759777},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Direct integration with Fathom's API for up-to-date meeting data","depth":16,"bounds":{"left":0.53108376,"top":0.40822026,"width":0.15890957,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🛡️ Secure","depth":17,"bounds":{"left":0.5,"top":0.4301676,"width":0.02443484,"height":0.016759777},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": API key management through environment variables","depth":16,"bounds":{"left":0.52443486,"top":0.43056664,"width":0.12865691,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🚀 Quick Start","depth":14,"bounds":{"left":0.4893617,"top":0.4668795,"width":0.2785904,"height":0.030327214},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🚀 Quick Start","depth":15,"bounds":{"left":0.4893617,"top":0.4668795,"width":0.050531916,"height":0.025139665},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🚀 Quick Start","depth":14,"bounds":{"left":0.4800532,"top":0.4668795,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Prerequisites","depth":14,"bounds":{"left":0.4893617,"top":0.51636076,"width":0.2785904,"height":0.019952115},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Prerequisites","depth":15,"bounds":{"left":0.4893617,"top":0.51675975,"width":0.040226065,"height":0.01915403},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: Prerequisites","depth":14,"bounds":{"left":0.4800532,"top":0.5151636,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Node.js 18 or higher","depth":16,"bounds":{"left":0.5,"top":0.5510774,"width":0.048537236,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"npm or yarn","depth":16,"bounds":{"left":0.5,"top":0.5734238,"width":0.029089095,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"A Fathom AI account with API access","depth":16,"bounds":{"left":0.5,"top":0.5957702,"width":0.08959442,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Claude Desktop app","depth":16,"bounds":{"left":0.5,"top":0.6181165,"width":0.049035903,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Installation","depth":14,"bounds":{"left":0.4893617,"top":0.6544294,"width":0.2785904,"height":0.019952115},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Installation","depth":15,"bounds":{"left":0.4893617,"top":0.6548284,"width":0.03357713,"height":0.01915403},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: Installation","depth":14,"bounds":{"left":0.4800532,"top":0.6532322,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Clone and setup","depth":17,"bounds":{"left":0.5,"top":0.68914604,"width":0.04089096,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"bounds":{"left":0.54089093,"top":0.68914604,"width":0.0014960107,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"git clone https://github.com/sourcegate/mcp-fathom-server.git","depth":16,"bounds":{"left":0.49468085,"top":0.7330407,"width":0.16589096,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"cd","depth":16,"bounds":{"left":0.49468085,"top":0.7490024,"width":0.005319149,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"mcp-fathom-server\nnpm install\nnpm run build","depth":16,"bounds":{"left":0.49468085,"top":0.7490024,"width":0.05435505,"height":0.044692736},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"bounds":{"left":0.75598407,"top":0.7254589,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Configure your API key","depth":17,"bounds":{"left":0.5,"top":0.8224262,"width":0.057679523,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"bounds":{"left":0.55767953,"top":0.8224262,"width":0.0014960107,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"cp .env.example .env","depth":16,"bounds":{"left":0.49468085,"top":0.86632085,"width":0.05435505,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":16,"bounds":{"left":0.49468085,"top":0.8818835,"width":0.0026595744,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Edit .env and add your Fathom API key","depth":16,"bounds":{"left":0.4973404,"top":0.8818835,"width":0.103390954,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"bounds":{"left":0.75598407,"top":0.858739,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Get your Fathom API key","depth":18,"bounds":{"left":0.5,"top":0.92418194,"width":0.06200133,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":17,"bounds":{"left":0.56200135,"top":0.92418194,"width":0.0014960107,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Log in to","depth":18,"bounds":{"left":0.5106383,"top":0.95610535,"width":0.02244016,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fathom","depth":18,"bounds":{"left":0.53307843,"top":0.95610535,"width":0.017952127,"height":0.015163607},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fathom","depth":19,"bounds":{"left":0.53307843,"top":0.95610535,"width":0.017952127,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Go to Settings → API","depth":18,"bounds":{"left":0.5106383,"top":0.9784517,"width":0.05036569,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Generate a new API key","depth":18,"bounds":{"left":0.5106383,"top":1.0,"width":0.057347074,"height":-0.0007981062},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Copy it to your","depth":18,"bounds":{"left":0.5106383,"top":1.0,"width":0.036901597,"height":-0.023144484},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".env","depth":19,"bounds":{"left":0.5493683,"top":1.0,"width":0.010970744,"height":-0.02513969},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"file","depth":18,"bounds":{"left":0.5621675,"top":1.0,"width":0.008643617,"height":-0.023144484},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Add to Claude Desktop","depth":18,"bounds":{"left":0.5,"top":1.0,"width":0.058011968,"height":-0.055067778},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":17,"bounds":{"left":0.55801195,"top":1.0,"width":0.0014960107,"height":-0.055067778},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Edit your Claude Desktop configuration file:","depth":15,"bounds":{"left":0.4893617,"top":1.0,"width":0.10488697,"height":-0.08699119},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"macOS","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"~/Library/Application Support/Claude/claude_desktop_config.json","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Windows","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"%APPDATA%\\Claude\\claude_desktop_config.json","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"{","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"mcpServers\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": {","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"fathom\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": {","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"command\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"node","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":",","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"args\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": [","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/absolute/path/to/mcp-fathom-server/dist/index.js","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"],","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"env\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": {","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"FATHOM_API_KEY\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"your-api-key-here","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"}\n }\n }\n}","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Restart Claude Desktop","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and you're ready to go! 🎉","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"💬 Usage Examples","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"💬 Usage Examples","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 💬 Usage Examples","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Once configured, you can ask Claude natural language questions about your meetings:","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"Find me meetings about recruiting\"\n\"Show me all external meetings from last week\" \n\"Search for meetings where we discussed product launches\"\n\"List meetings with john@example.com\"\n\"Find meetings with action items about hiring\"\n\"What did we discuss in our Q1 planning meetings?\"","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Claude will automatically choose the right tool and search method based on your query.","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🔧 Available Tools","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🔧 Available Tools","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🔧 Available Tools","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"list_meetings","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"list_meetings","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: list_meetings","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Retrieves meetings with optional filters:","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"calendar_invitees","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by attendee emails","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"calendar_invitees_domains","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by company domains","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"created_after","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"created_before","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Date range filters","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"meeting_type","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": all, internal, or external","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"include_transcript","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Include full transcripts","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"recorded_by","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by meeting owner","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-2606557910133373254
|
-301909439424084290
|
idle
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {"status":"error","message":"You have reached your secondly limit.","errorType":"RATE_LIMIT
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {"status":"error","message":"You have reached your secondly limit.","errorType":"RATE_LIMIT
[JY-20372] AI Reports > Empty page design and promotion - Jira
[JY-20372] AI Reports > Empty page design and promotion - Jira
Jiminny MCP Connector - Product - Confluence
Jiminny MCP Connector - Product - Confluence
Jiminny
Jiminny
Workers | Datadog
Workers | Datadog
Pull requests · jiminny/app
Pull requests · jiminny/app
[JY-20728] [HubSpot] Find the root cause of 429 hit and tweak API client rate limiter - Jira
[JY-20728] [HubSpot] Find the root cause of 429 hit and tweak API client rate limiter - Jira
JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app
JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app
Jiminny
Jiminny
CloudWatch | us-east-2
CloudWatch | us-east-2
Your 'Not enpough activities' report wasn't generated - [EMAIL] - Jiminny Mail
Your 'Not enpough activities' report wasn't generated - [EMAIL] - Jiminny Mail
Jiminny MCP Connector - Product - Confluence
Jiminny MCP Connector - Product - Confluence
sourcegate/mcp-fathom-server
sourcegate/mcp-fathom-server
Close tab
JY-9712 | change nudges schema by nikolaybiaivanov · Pull Request #11983 · jiminny/app
JY-9712 | change nudges schema by nikolaybiaivanov · Pull Request #11983 · jiminny/app
JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app
JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app
Architecture overview - Model Context Protocol
Architecture overview - Model Context Protocol
Laravel MCP - AI tooling for Laravel, by the Laravel team | Laravel - The clean stack for Artisans and agents
Laravel MCP - AI tooling for Laravel, by the Laravel team | Laravel - The clean stack for Artisans and agents
Laravel MCP | Laravel 13.x - The clean stack for Artisans and agents
Laravel MCP | Laravel 13.x - The clean stack for Artisans and agents
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Skip to content
Skip to content
Open menu
Homepage (g then d)
sourcegate
sourcegate
mcp-fathom-server
mcp-fathom-server
Search or jump to…
Type
/
to search
Chat with Copilot
Open Copilot…
Create new...
Issues
Pull requests
Repositories
You have unread notifications(g then n)
Open user navigation menu
Repository navigation
Repository navigation
Code
Code
Issues
Issues
Pull requests (2)
Pull requests
(
2
)
Agents
Agents
Actions
Actions
Projects
Projects
Security and quality
Security and quality
Insights
Insights
Important update
Important update
On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.
Review this update
Review this update
and manage your preferences in your
GitHub account settings
GitHub account settings
.
Dismiss banner
mcp-fathom-server
mcp-fathom-server
Public
Watch: Participating in sourcegate/mcp-fathom-server
Watch
(
0
)
Fork 4
Fork
4
See your forks of this repository
Star this repository (8)
Star
8
Add this repository to a list
sourcegate/mcp-fathom-server
sourcegate/mcp-fathom-server
main branch
main
1 Branch
1
Branch
0 Tags
0
Tags
Go to file
Add file
Add file
Add file
Add file
Code
Code
Folders and files
Folders and files
Name
Last commit message
Last commit date
Latest commit
Latest commit
commits by sourcegate
sourcegate
and
commits by claude
claude
Update README with GitHub integration status
Update README with GitHub integration status
Open commit details
Commit f36377c
f36377c
·
4 months ago
History
History
6 Commits
6 Commits
src, (Directory)
src
Fix Claude integration: Add stub handlers for resources and prompts
Fix Claude integration: Add stub handlers for resources and prompts
8 months ago
.env.example, (File)
.env.example
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
8 months ago
.gitignore, (File)
.gitignore
Performance optimization: Fix search timeouts
Performance optimization: Fix search timeouts
8 months ago
LICENSE, (File)
LICENSE
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
8 months ago
README.md, (File)
README.md
Update README with GitHub integration status
Update README with GitHub integration status
4 months ago
claude-config-example.json, (File)
claude-config-example.json
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
8 months ago
package-lock.json, (File)
package-lock.json
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
8 months ago
package.json, (File)
package.json
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
8 months ago
tsconfig.json, (File)
tsconfig.json
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
8 months ago
Name
Latest commit
Latest commit
commits by sourcegate
sourcegate
and
commits by claude
claude
Update README with GitHub integration status
Update README with GitHub integration status
Open commit details
Commit f36377c
f36377c
·
4 months ago
History
History
6 Commits
6 Commits
src, (Directory)
src
.env.example, (File)
.env.example
.gitignore, (File)
.gitignore
LICENSE, (File)
LICENSE
README.md, (File)
README.md
claude-config-example.json, (File)
claude-config-example.json
package-lock.json, (File)
package-lock.json
package.json, (File)
package.json
tsconfig.json, (File)
tsconfig.json
Last commit message
Latest commit
Latest commit
commits by sourcegate
sourcegate
and
commits by claude
claude
Update README with GitHub integration status
Update README with GitHub integration status
Open commit details
Commit f36377c
f36377c
·
4 months ago
History
History
6 Commits
6 Commits
Fix Claude integration: Add stub handlers for resources and prompts
Fix Claude integration: Add stub handlers for resources and prompts
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
Performance optimization: Fix search timeouts
Performance optimization: Fix search timeouts
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
Update README with GitHub integration status
Update README with GitHub integration status
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
Initial release of MCP Fathom Server
Last commit date
Latest commit
Latest commit
commits by sourcegate
sourcegate
and
commits by claude
claude
Update README with GitHub integration status
Update README with GitHub integration status
Open commit details
Commit f36377c
f36377c
·
4 months ago
History
History
6 Commits
6 Commits
8 months ago
8 months ago
8 months ago
8 months ago
4 months ago
8 months ago
8 months ago
8 months ago
8 months ago
Repository files navigation
Repository files navigation
README
README
MIT license
MIT license
Edit file
Outline
MCP Fathom Server
MCP Fathom Server
Permalink: MCP Fathom Server
An MCP (Model Context Protocol) server that integrates with Fathom AI's meeting API, enabling Claude to search and retrieve meeting information through natural language queries.
MCP
Node.js
TypeScript
🎯 Features
🎯 Features
Permalink: 🎯 Features
🔍 Smart Search
: Natural language search across meeting titles, summaries, transcripts, and action items
📋 List Meetings
: Retrieve meetings with various filters (attendees, date ranges, teams, etc.)
📝 Transcript Support
: Optionally include full meeting transcripts in search results
⚡ Real-time
: Direct integration with Fathom's API for up-to-date meeting data
🛡️ Secure
: API key management through environment variables
🚀 Quick Start
🚀 Quick Start
Permalink: 🚀 Quick Start
Prerequisites
Prerequisites
Permalink: Prerequisites
Node.js 18 or higher
npm or yarn
A Fathom AI account with API access
Claude Desktop app
Installation
Installation
Permalink: Installation
Clone and setup
:
git clone https://github.com/sourcegate/mcp-fathom-server.git
cd
mcp-fathom-server
npm install
npm run build
Copy
Configure your API key
:
cp .env.example .env
#
Edit .env and add your Fathom API key
Copy
Get your Fathom API key
:
Log in to
Fathom
Fathom
Go to Settings → API
Generate a new API key
Copy it to your
.env
file
Add to Claude Desktop
:
Edit your Claude Desktop configuration file:
macOS
:
~/Library/Application Support/Claude/claude_desktop_config.json
Windows
:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers"
: {
"fathom"
: {
"command"
:
"
node
"
,
"args"
: [
"
/absolute/path/to/mcp-fathom-server/dist/index.js
"
],
"env"
: {
"FATHOM_API_KEY"
:
"
your-api-key-here
"
}
}
}
}
Copy
Restart Claude Desktop
and you're ready to go! 🎉
💬 Usage Examples
💬 Usage Examples
Permalink: 💬 Usage Examples
Once configured, you can ask Claude natural language questions about your meetings:
"Find me meetings about recruiting"
"Show me all external meetings from last week"
"Search for meetings where we discussed product launches"
"List meetings with [EMAIL]"
"Find meetings with action items about hiring"
"What did we discuss in our Q1 planning meetings?"
Copy
Claude will automatically choose the right tool and search method based on your query.
🔧 Available Tools
🔧 Available Tools
Permalink: 🔧 Available Tools
list_meetings
list_meetings
Permalink: list_meetings
Retrieves meetings with optional filters:
calendar_invitees
: Filter by attendee emails
calendar_invitees_domains
: Filter by company domains
created_after
/
created_before
: Date range filters
meeting_type
: all, internal, or external
include_transcript
: Include full transcripts
recorded_by
: Filter by meeting owner...
|
72378
|
NULL
|
|
72381
|
1765
|
8
|
2026-04-22T15:41:27.944364+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-22/1776 /Users/lukas/.screenpipe/data/data/2026-04-22/1776872487944_m2.jpg...
|
Firefox
|
sourcegate/mcp-fathom-server — Work
|
1
|
github.com/sourcegate/mcp-fathom-server
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST [URL_WITH_CREDENTIALS] dist/index.js
Copy
🐛 Troubleshooting
🐛 Troubleshooting
Permalink: 🐛 Troubleshooting
Issue
Solution
Server won't start
Check that your API key is correctly set
No results found
Try broader search terms or check your API key permissions
Rate limiting
The server handles this automatically - wait a moment and try again
Claude can't find tools
Ensure Claude Desktop is restarted after config changes
Issue
Server won't start
No results found
Rate limiting
Claude can't find tools
Solution
Check that your API key is correctly set
Try broader search terms or check your API key permissions
The server handles this automatically - wait a moment and try again
Ensure Claude Desktop is restarted after config changes
📄 License
📄 License
Permalink: 📄 License
MIT License - see
LICENSE
LICENSE
file for details.
🤝 Contributing
🤝 Contributing
Permalink: 🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
🙋♀️ Support
🙋♀️ Support
Permalink: 🙋♀️ Support
If you encounter any issues:
Check the
troubleshooting section
troubleshooting section
Search existing
GitHub issues
GitHub issues
Create a new issue with detailed information about your problem
Status
: Tested and working with GitHub integration ✓
Built for fun by
@petesena
@petesena
❤️
About
About
No description, website, or topics provided.
Resources
Resources
Readme
Readme
License
License
MIT license
MIT license
Activity
Activity
Stars
Stars...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"bounds":{"left":0.28307846,"top":0.0518755,"width":0.07596409,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"SevenShores\\Hubspot\\Exceptions\\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT","depth":4,"bounds":{"left":0.28125,"top":0.09497207,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SevenShores\\Hubspot\\Exceptions\\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT","depth":5,"bounds":{"left":0.2945479,"top":0.10614525,"width":0.4644282,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20372] AI Reports > Empty page design and promotion - Jira","depth":4,"bounds":{"left":0.28125,"top":0.12769353,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20372] AI Reports > Empty page design and promotion - Jira","depth":5,"bounds":{"left":0.2945479,"top":0.13886672,"width":0.11319814,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny MCP Connector - Product - Confluence","depth":4,"bounds":{"left":0.28125,"top":0.16041501,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny MCP Connector - Product - Confluence","depth":5,"bounds":{"left":0.2945479,"top":0.17158818,"width":0.08294548,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.28125,"top":0.19313647,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"bounds":{"left":0.2945479,"top":0.20430966,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Workers | Datadog","depth":4,"bounds":{"left":0.28125,"top":0.22585794,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Workers | Datadog","depth":5,"bounds":{"left":0.2945479,"top":0.23703113,"width":0.032081116,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pull requests · jiminny/app","depth":4,"bounds":{"left":0.28125,"top":0.2585794,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests · jiminny/app","depth":5,"bounds":{"left":0.2945479,"top":0.2697526,"width":0.04537899,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20728] [HubSpot] Find the root cause of 429 hit and tweak API client rate limiter - Jira","depth":4,"bounds":{"left":0.28125,"top":0.29130086,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20728] [HubSpot] Find the root cause of 429 hit and tweak API client rate limiter - Jira","depth":5,"bounds":{"left":0.2945479,"top":0.30247405,"width":0.15791224,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":4,"bounds":{"left":0.28125,"top":0.32402235,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":5,"bounds":{"left":0.2945479,"top":0.33519554,"width":0.16555852,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.28125,"top":0.3567438,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"bounds":{"left":0.2945479,"top":0.367917,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"CloudWatch | us-east-2","depth":4,"bounds":{"left":0.28125,"top":0.38946527,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"CloudWatch | us-east-2","depth":5,"bounds":{"left":0.2945479,"top":0.40063846,"width":0.041223403,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Your 'Not enpough activities' report wasn't generated - lukas.kovalik@jiminny.com - Jiminny Mail","depth":4,"bounds":{"left":0.28125,"top":0.42218676,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Your 'Not enpough activities' report wasn't generated - lukas.kovalik@jiminny.com - Jiminny Mail","depth":5,"bounds":{"left":0.2945479,"top":0.43335995,"width":0.16821809,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny MCP Connector - Product - Confluence","depth":4,"bounds":{"left":0.28125,"top":0.45490822,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny MCP Connector - Product - Confluence","depth":5,"bounds":{"left":0.2945479,"top":0.4660814,"width":0.08294548,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"sourcegate/mcp-fathom-server","depth":4,"bounds":{"left":0.28125,"top":0.48762968,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"sourcegate/mcp-fathom-server","depth":5,"bounds":{"left":0.2945479,"top":0.49880287,"width":0.0546875,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.34857047,"top":0.49481246,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"JY-9712 | change nudges schema by nikolaybiaivanov · Pull Request #11983 · jiminny/app","depth":4,"bounds":{"left":0.28125,"top":0.5203512,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-9712 | change nudges schema by nikolaybiaivanov · Pull Request #11983 · jiminny/app","depth":5,"bounds":{"left":0.2945479,"top":0.53152436,"width":0.15475398,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":4,"bounds":{"left":0.28125,"top":0.55307263,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-9712 | Nuges to expire after one year by nikolaybiaivanov · Pull Request #11981 · jiminny/app","depth":5,"bounds":{"left":0.2945479,"top":0.5642458,"width":0.16555852,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Architecture overview - Model Context Protocol","depth":4,"bounds":{"left":0.28125,"top":0.5857941,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Architecture overview - Model Context Protocol","depth":5,"bounds":{"left":0.2945479,"top":0.5969673,"width":0.08277926,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Laravel MCP - AI tooling for Laravel, by the Laravel team | Laravel - The clean stack for Artisans and agents","depth":4,"bounds":{"left":0.28125,"top":0.61851555,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Laravel MCP - AI tooling for Laravel, by the Laravel team | Laravel - The clean stack for Artisans and agents","depth":5,"bounds":{"left":0.2945479,"top":0.62968874,"width":0.18583776,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Laravel MCP | Laravel 13.x - The clean stack for Artisans and agents","depth":4,"bounds":{"left":0.28125,"top":0.651237,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Laravel MCP | Laravel 13.x - The clean stack for Artisans and agents","depth":5,"bounds":{"left":0.2945479,"top":0.6624102,"width":0.1178524,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.2840758,"top":0.6855547,"width":0.07413564,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.2840758,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.29504654,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.30618352,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.31732047,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.32845744,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Skip to content","depth":6,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to content","depth":7,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open menu","depth":10,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Homepage (g then d)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"sourcegate","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"mcp-fathom-server","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"mcp-fathom-server","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Search or jump to…","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Type","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"to search","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Chat with Copilot","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Open Copilot…","depth":9,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"Create new...","depth":9,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Issues","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Pull requests","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Repositories","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"You have unread notifications(g then n)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Open user navigation menu","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Repository navigation","depth":9,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Repository navigation","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Code","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Code","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Issues","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Issues","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Pull requests (2)","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Agents","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Agents","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Actions","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Actions","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Projects","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Projects","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Security and quality","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Security and quality","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Insights","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Insights","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Important update","depth":10,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Important update","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Review this update","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Review this update","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and manage your preferences in your","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"GitHub account settings","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"GitHub account settings","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Dismiss banner","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"mcp-fathom-server","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"mcp-fathom-server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Public","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Watch: Participating in sourcegate/mcp-fathom-server","depth":19,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Watch","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fork 4","depth":17,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fork","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"See your forks of this repository","depth":18,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Star this repository (8)","depth":18,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Star","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Add this repository to a list","depth":19,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"sourcegate/mcp-fathom-server","depth":13,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"sourcegate/mcp-fathom-server","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"main branch","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"main","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"1 Branch","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"1","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Branch","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"0 Tags","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"0","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Tags","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXComboBox","text":"Go to file","depth":13,"role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"Add file","depth":12,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Add file","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Add file","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Add file","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Code","depth":12,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Code","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Folders and files","depth":12,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Folders and files","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Name","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit message","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit date","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"src, (Directory)","depth":18,"help_text":"src","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"src","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":16,"help_text":"Fix Claude integration: Add stub handlers for resources and prompts - Added ListResourcesRequestSchema and ListPromptsRequestSchema handlers - Return empty arrays to prevent 'Method not found' errors - Updated server capabilities to include resources and prompts - Fixes Claude treating server as broken due to optional endpoint errors","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".env.example, (File)","depth":18,"help_text":".env.example","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".env.example","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".gitignore, (File)","depth":18,"help_text":".gitignore","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".gitignore","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Performance optimization: Fix search timeouts","depth":16,"help_text":"Performance optimization: Fix search timeouts - Limited search to last 30 days instead of all meetings - Disabled transcript search by default (was causing 1.6MB+ responses) - Added logging for better debugging visibility - Updated tool descriptions to clarify limitations - Removed dangerous pagination loop that fetched all meetings Fixes timeout issues when searching for meetings with transcripts","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Performance optimization: Fix search timeouts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"LICENSE, (File)","depth":18,"help_text":"LICENSE","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"LICENSE","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"README.md, (File)","depth":18,"help_text":"README.md","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"README.md","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"Update README with GitHub integration status Add testing status note to confirm GitHub app integration is working correctly. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"claude-config-example.json, (File)","depth":18,"help_text":"claude-config-example.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude-config-example.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package-lock.json, (File)","depth":18,"help_text":"package-lock.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package-lock.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package.json, (File)","depth":18,"help_text":"package.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"tsconfig.json, (File)","depth":18,"help_text":"tsconfig.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"tsconfig.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Name","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"src, (Directory)","depth":18,"help_text":"src","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"src","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".env.example, (File)","depth":18,"help_text":".env.example","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".env.example","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":".gitignore, (File)","depth":18,"help_text":".gitignore","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".gitignore","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"LICENSE, (File)","depth":18,"help_text":"LICENSE","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"LICENSE","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"README.md, (File)","depth":18,"help_text":"README.md","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"README.md","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"claude-config-example.json, (File)","depth":18,"help_text":"claude-config-example.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude-config-example.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package-lock.json, (File)","depth":18,"help_text":"package-lock.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package-lock.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"package.json, (File)","depth":18,"help_text":"package.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"package.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"tsconfig.json, (File)","depth":18,"help_text":"tsconfig.json","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"tsconfig.json","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit message","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":16,"help_text":"Fix Claude integration: Add stub handlers for resources and prompts - Added ListResourcesRequestSchema and ListPromptsRequestSchema handlers - Return empty arrays to prevent 'Method not found' errors - Updated server capabilities to include resources and prompts - Fixes Claude treating server as broken due to optional endpoint errors","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fix Claude integration: Add stub handlers for resources and prompts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Performance optimization: Fix search timeouts","depth":16,"help_text":"Performance optimization: Fix search timeouts - Limited search to last 30 days instead of all meetings - Disabled transcript search by default (was causing 1.6MB+ responses) - Added logging for better debugging visibility - Updated tool descriptions to clarify limitations - Removed dangerous pagination loop that fetched all meetings Fixes timeout issues when searching for meetings with transcripts","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Performance optimization: Fix search timeouts","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"Update README with GitHub integration status Add testing status note to confirm GitHub app integration is working correctly. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Initial release of MCP Fathom Server","depth":16,"help_text":"Initial release of MCP Fathom Server 🚀 Features: - Natural language search across Fathom meeting data - List meetings with comprehensive filtering options - Search within titles, summaries, transcripts, and action items - Secure API key management via environment variables - Full TypeScript implementation with proper error handling 🛠️ Technical: - Built with MCP SDK v1.17+ - Axios for reliable HTTP requests - Zod schema validation for type safety - Comprehensive documentation and examples 🔧 Ready for production use with Claude Desktop integration","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Initial release of MCP Fathom Server","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Last commit date","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Latest commit","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by sourcegate","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sourcegate","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"commits by claude","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"claude","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Update README with GitHub integration status","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update README with GitHub integration status","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Open commit details","depth":15,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Commit f36377c","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f36377c","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6 Commits","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6 Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8 months ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Repository files navigation","depth":13,"bounds":{"left":0.47839096,"top":0.0,"width":0.0003324468,"height":0.0007980846},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Repository files navigation","depth":14,"bounds":{"left":0.47839096,"top":0.0,"width":0.095578454,"height":0.023144454},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"README","depth":16,"bounds":{"left":0.48138297,"top":0.0,"width":0.03274601,"height":0.026336791},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"README","depth":18,"bounds":{"left":0.49202126,"top":0.0,"width":0.019448139,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"MIT license","depth":16,"bounds":{"left":0.51678854,"top":0.0,"width":0.03873005,"height":0.026336791},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"MIT license","depth":18,"bounds":{"left":0.52792555,"top":0.0,"width":0.02443484,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Edit file","depth":13,"bounds":{"left":0.75265956,"top":0.0,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Outline","depth":13,"bounds":{"left":0.76462764,"top":0.0,"width":0.011303191,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"MCP Fathom Server","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"MCP Fathom Server","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: MCP Fathom Server","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"An MCP (Model Context Protocol) server that integrates with Fathom AI's meeting API, enabling Claude to search and retrieve meeting information through natural language queries.","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"MCP","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Node.js","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"TypeScript","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"🎯 Features","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🎯 Features","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🎯 Features","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"🔍 Smart Search","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Natural language search across meeting titles, summaries, transcripts, and action items","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"📋 List Meetings","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Retrieve meetings with various filters (attendees, date ranges, teams, etc.)","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"📝 Transcript Support","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Optionally include full meeting transcripts in search results","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"⚡ Real-time","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Direct integration with Fathom's API for up-to-date meeting data","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🛡️ Secure","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": API key management through environment variables","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🚀 Quick Start","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🚀 Quick Start","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🚀 Quick Start","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Prerequisites","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Prerequisites","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: Prerequisites","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Node.js 18 or higher","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"npm or yarn","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"A Fathom AI account with API access","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Claude Desktop app","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Installation","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Installation","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: Installation","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Clone and setup","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"git clone https://github.com/sourcegate/mcp-fathom-server.git","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"cd","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"mcp-fathom-server\nnpm install\nnpm run build","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Configure your API key","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"cp .env.example .env","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Edit .env and add your Fathom API key","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Get your Fathom API key","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Log in to","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Fathom","depth":18,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Fathom","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Go to Settings → API","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Generate a new API key","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Copy it to your","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".env","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"file","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Add to Claude Desktop","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Edit your Claude Desktop configuration file:","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"macOS","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"~/Library/Application Support/Claude/claude_desktop_config.json","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Windows","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"%APPDATA%\\Claude\\claude_desktop_config.json","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"{","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"mcpServers\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": {","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"fathom\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": {","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"command\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"node","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":",","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"args\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": [","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/absolute/path/to/mcp-fathom-server/dist/index.js","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"],","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"env\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": {","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"FATHOM_API_KEY\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"your-api-key-here","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"}\n }\n }\n}","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Restart Claude Desktop","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and you're ready to go! 🎉","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"💬 Usage Examples","depth":14,"bounds":{"left":0.4893617,"top":0.0,"width":0.2785904,"height":0.030726258},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"💬 Usage Examples","depth":15,"bounds":{"left":0.4893617,"top":0.0,"width":0.0696476,"height":0.025139665},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 💬 Usage Examples","depth":14,"bounds":{"left":0.4800532,"top":0.0,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Once configured, you can ask Claude natural language questions about your meetings:","depth":15,"bounds":{"left":0.4893617,"top":0.0,"width":0.2096077,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"Find me meetings about recruiting\"\n\"Show me all external meetings from last week\" \n\"Search for meetings where we discussed product launches\"\n\"List meetings with john@example.com\"\n\"Find meetings with action items about hiring\"\n\"What did we discuss in our Q1 planning meetings?\"","depth":17,"bounds":{"left":0.49468085,"top":0.0,"width":0.1549202,"height":0.09177973},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"bounds":{"left":0.75598407,"top":0.0,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Claude will automatically choose the right tool and search method based on your query.","depth":15,"bounds":{"left":0.4893617,"top":0.112529926,"width":0.21160239,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🔧 Available Tools","depth":14,"bounds":{"left":0.4893617,"top":0.14884278,"width":0.2785904,"height":0.030726258},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🔧 Available Tools","depth":15,"bounds":{"left":0.4893617,"top":0.14884278,"width":0.06333112,"height":0.025139665},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🔧 Available Tools","depth":14,"bounds":{"left":0.4800532,"top":0.14924182,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"list_meetings","depth":14,"bounds":{"left":0.4893617,"top":0.19872306,"width":0.2785904,"height":0.020351157},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"list_meetings","depth":16,"bounds":{"left":0.49069148,"top":0.19952115,"width":0.051861703,"height":0.01915403},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: list_meetings","depth":14,"bounds":{"left":0.4800532,"top":0.19752593,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Retrieves meetings with optional filters:","depth":15,"bounds":{"left":0.4893617,"top":0.23383878,"width":0.094913565,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"calendar_invitees","depth":17,"bounds":{"left":0.50166225,"top":0.2677574,"width":0.04637633,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by attendee emails","depth":16,"bounds":{"left":0.5497008,"top":0.26576218,"width":0.06216755,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"calendar_invitees_domains","depth":17,"bounds":{"left":0.50166225,"top":0.29010376,"width":0.06815159,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by company domains","depth":16,"bounds":{"left":0.57147604,"top":0.28810853,"width":0.06798537,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"created_after","depth":17,"bounds":{"left":0.50166225,"top":0.3124501,"width":0.035405584,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":16,"bounds":{"left":0.53889626,"top":0.3104549,"width":0.0014960107,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"created_before","depth":17,"bounds":{"left":0.5422208,"top":0.3124501,"width":0.038065158,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Date range filters","depth":16,"bounds":{"left":0.58211434,"top":0.3104549,"width":0.044714097,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"meeting_type","depth":17,"bounds":{"left":0.50166225,"top":0.3347965,"width":0.03274601,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": all, internal, or external","depth":16,"bounds":{"left":0.5362367,"top":0.33280128,"width":0.057845745,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"include_transcript","depth":17,"bounds":{"left":0.50166225,"top":0.35714287,"width":0.049035903,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Include full transcripts","depth":16,"bounds":{"left":0.5525266,"top":0.35514766,"width":0.05668218,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"recorded_by","depth":17,"bounds":{"left":0.50166225,"top":0.3794892,"width":0.029920213,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by meeting owner","depth":16,"bounds":{"left":0.5334109,"top":0.377494,"width":0.059674203,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"teams","depth":17,"bounds":{"left":0.50166225,"top":0.4018356,"width":0.013630319,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Filter by team names","depth":16,"bounds":{"left":0.517121,"top":0.39984038,"width":0.053357713,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"search_meetings","depth":14,"bounds":{"left":0.4893617,"top":0.43615323,"width":0.2785904,"height":0.020351157},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"search_meetings","depth":16,"bounds":{"left":0.49069148,"top":0.4369513,"width":0.06000665,"height":0.01915403},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: search_meetings","depth":14,"bounds":{"left":0.4800532,"top":0.4349561,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Searches meetings by keywords:","depth":15,"bounds":{"left":0.4893617,"top":0.47126895,"width":0.079288565,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"search_term","depth":17,"bounds":{"left":0.50166225,"top":0.5051876,"width":0.029920213,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": The keyword/phrase to search for","depth":16,"bounds":{"left":0.5334109,"top":0.50319237,"width":0.08427527,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"include_transcript","depth":17,"bounds":{"left":0.50166225,"top":0.5275339,"width":0.049035903,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Search within transcripts (slower but more comprehensive)","depth":16,"bounds":{"left":0.5525266,"top":0.5255387,"width":0.14544548,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🛠️ Development","depth":14,"bounds":{"left":0.4893617,"top":0.56185156,"width":0.2785904,"height":0.030327214},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🛠️ Development","depth":15,"bounds":{"left":0.4893617,"top":0.56185156,"width":0.057845745,"height":0.025139665},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🛠️ Development","depth":14,"bounds":{"left":0.4800532,"top":0.56185156,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"#","depth":16,"bounds":{"left":0.49468085,"top":0.6189146,"width":0.0026595744,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Run in development mode","depth":16,"bounds":{"left":0.4973404,"top":0.6189146,"width":0.0653258,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"npm run dev","depth":16,"bounds":{"left":0.49468085,"top":0.6348763,"width":0.029920213,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":16,"bounds":{"left":0.49468085,"top":0.6328811,"width":0.0026595744,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Build for production","depth":16,"bounds":{"left":0.4973404,"top":0.6328811,"width":0.05718085,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"npm run build","depth":16,"bounds":{"left":0.49468085,"top":0.64844376,"width":0.03523936,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":16,"bounds":{"left":0.49468085,"top":0.67996806,"width":0.0026595744,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Test with MCP Inspector","depth":16,"bounds":{"left":0.4973404,"top":0.67996806,"width":0.0653258,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"npx @modelcontextprotocol/inspector dist/index.js","depth":16,"bounds":{"left":0.49468085,"top":0.6955307,"width":0.13314494,"height":0.0131683955},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy","depth":15,"bounds":{"left":0.75598407,"top":0.57781327,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"🐛 Troubleshooting","depth":14,"bounds":{"left":0.4893617,"top":0.7422187,"width":0.2785904,"height":0.030327214},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🐛 Troubleshooting","depth":15,"bounds":{"left":0.4893617,"top":0.7422187,"width":0.06881649,"height":0.025139665},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🐛 Troubleshooting","depth":14,"bounds":{"left":0.4800532,"top":0.7422187,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Issue","depth":18,"bounds":{"left":0.515625,"top":0.79289705,"width":0.013297873,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Solution","depth":18,"bounds":{"left":0.63048536,"top":0.79289705,"width":0.020611702,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Server won't start","depth":19,"bounds":{"left":0.49401596,"top":0.8224262,"width":0.045212764,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Check that your API key is correctly set","depth":18,"bounds":{"left":0.55950797,"top":0.8224262,"width":0.09424867,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"No results found","depth":19,"bounds":{"left":0.49401596,"top":0.8519553,"width":0.04155585,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Try broader search terms or check your API key permissions","depth":18,"bounds":{"left":0.55950797,"top":0.8519553,"width":0.14444813,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Rate limiting","depth":19,"bounds":{"left":0.49401596,"top":0.88148445,"width":0.03125,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"The server handles this automatically - wait a moment and try again","depth":18,"bounds":{"left":0.55950797,"top":0.88148445,"width":0.16256648,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Claude can't find tools","depth":19,"bounds":{"left":0.49401596,"top":0.91101354,"width":0.05651596,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ensure Claude Desktop is restarted after config changes","depth":18,"bounds":{"left":0.55950797,"top":0.91101354,"width":0.13580452,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Issue","depth":18,"bounds":{"left":0.515625,"top":0.79289705,"width":0.013297873,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Server won't start","depth":19,"bounds":{"left":0.49401596,"top":0.8224262,"width":0.045212764,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"No results found","depth":19,"bounds":{"left":0.49401596,"top":0.8519553,"width":0.04155585,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Rate limiting","depth":19,"bounds":{"left":0.49401596,"top":0.88148445,"width":0.03125,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Claude can't find tools","depth":19,"bounds":{"left":0.49401596,"top":0.91101354,"width":0.05651596,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Solution","depth":18,"bounds":{"left":0.63048536,"top":0.79289705,"width":0.020611702,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Check that your API key is correctly set","depth":18,"bounds":{"left":0.55950797,"top":0.8224262,"width":0.09424867,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Try broader search terms or check your API key permissions","depth":18,"bounds":{"left":0.55950797,"top":0.8519553,"width":0.14444813,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"The server handles this automatically - wait a moment and try again","depth":18,"bounds":{"left":0.55950797,"top":0.88148445,"width":0.16256648,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ensure Claude Desktop is restarted after config changes","depth":18,"bounds":{"left":0.55950797,"top":0.91101354,"width":0.13580452,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"📄 License","depth":14,"bounds":{"left":0.4893617,"top":0.952913,"width":0.2785904,"height":0.030327214},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"📄 License","depth":15,"bounds":{"left":0.4893617,"top":0.952913,"width":0.037898935,"height":0.025139665},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 📄 License","depth":14,"bounds":{"left":0.4800532,"top":0.95331204,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"MIT License - see","depth":15,"bounds":{"left":0.4893617,"top":0.9980048,"width":0.04454787,"height":0.0019952059},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"LICENSE","depth":15,"bounds":{"left":0.53390956,"top":0.9644852,"width":0.021110373,"height":0.015163607},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"LICENSE","depth":16,"bounds":{"left":0.53390956,"top":0.9644852,"width":0.021110373,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"file for details.","depth":15,"bounds":{"left":0.55502,"top":0.9644852,"width":0.035738032,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🤝 Contributing","depth":14,"bounds":{"left":0.4893617,"top":1.0,"width":0.2785904,"height":-0.0007981062},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🤝 Contributing","depth":15,"bounds":{"left":0.4893617,"top":1.0,"width":0.055518616,"height":-0.0007981062},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🤝 Contributing","depth":14,"bounds":{"left":0.4800532,"top":1.0,"width":0.00930851,"height":-0.0011970997},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.","depth":15,"bounds":{"left":0.4893617,"top":1.0,"width":0.27726063,"height":-0.046288848},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🙋♀️ Support","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🙋♀️ Support","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Permalink: 🙋♀️ Support","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"If you encounter any issues:","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Check the","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"troubleshooting section","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"troubleshooting section","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Search existing","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"GitHub issues","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"GitHub issues","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Create a new issue with detailed information about your problem","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Status","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":": Tested and working with GitHub integration ✓","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Built for fun by","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"@petesena","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"@petesena","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"❤️","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"About","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"About","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"No description, website, or topics provided.","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Resources","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Resources","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Readme","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Readme","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"License","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"License","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"MIT license","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"MIT license","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Activity","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Activity","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Stars","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Stars","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-5669279073417969766
|
-4913595466441398338
|
visual_change
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST [URL_WITH_CREDENTIALS] dist/index.js
Copy
🐛 Troubleshooting
🐛 Troubleshooting
Permalink: 🐛 Troubleshooting
Issue
Solution
Server won't start
Check that your API key is correctly set
No results found
Try broader search terms or check your API key permissions
Rate limiting
The server handles this automatically - wait a moment and try again
Claude can't find tools
Ensure Claude Desktop is restarted after config changes
Issue
Server won't start
No results found
Rate limiting
Claude can't find tools
Solution
Check that your API key is correctly set
Try broader search terms or check your API key permissions
The server handles this automatically - wait a moment and try again
Ensure Claude Desktop is restarted after config changes
📄 License
📄 License
Permalink: 📄 License
MIT License - see
LICENSE
LICENSE
file for details.
🤝 Contributing
🤝 Contributing
Permalink: 🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
🙋♀️ Support
🙋♀️ Support
Permalink: 🙋♀️ Support
If you encounter any issues:
Check the
troubleshooting section
troubleshooting section
Search existing
GitHub issues
GitHub issues
Create a new issue with detailed information about your problem
Status
: Tested and working with GitHub integration ✓
Built for fun by
@petesena
@petesena
❤️
About
About
No description, website, or topics provided.
Resources
Resources
Readme
Readme
License
License
MIT license
MIT license
Activity
Activity
Stars
Stars...
|
NULL
|
NULL
|